public class Test {
private String key;
private Thread myThread = new Thread() {
public void run() {
String threadKey = key.replace(" ", "").replace("-", "");
System.out.println(threadKey);
};
};
public void doTask() {
key = "aa";
myThread.start();
key = null;
}
public static void main(String[] args) {
Test test = new Test();
test.doTask();
}
}
提供两种方法 一种利用Thread join,另一种使用线程同步锁 实测可行 有详细注释 望采纳
public class Test {
private String key;
private Thread myThread = new Thread() {
public void run() {
String threadKey = key.replace(" ", "").replace("-", "");
System.out.println(threadKey);
}
};
public void doTask() {
key = "aa";
myThread.start();
// Thread join 可使得多线程间并行执行变为串行执行
// myThread join 到主线程 必须等 myThread 执行完 主线程才能继续
try {
myThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
key = null;
}
public static void main(String[] args) {
Test test = new Test();
test.doTask();
}
}
public class Test {
private String key;
private Thread myThread = new Thread() {
public void run() {
String threadKey = key.replace(" ", "").replace("-", "");
System.out.println(threadKey);
// myThread 执行完毕 释放主线程锁
synchronized (Test.this) {
Test.this.notifyAll();
}
}
};
public void doTask() {
key = "aa";
myThread.start();
// 把主线程锁起来
synchronized (this) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
key = null;
}
public static void main(String[] args) {
Test test = new Test();
test.doTask();
}
}
你先判断可以是否为空,再去进行字符串操作
private Thread myThread = new Thread() {
public void run() {
if(key!=null&&key.length()>0){
String threadKey = key.replace(" ", "").replace("-", "");
System.out.println(threadKey);
}
};
};
public void run() {
if(key!=null&&!"".equals(key))
{
String threadKey = key.replace(" ", "").replace("-", "");
System.out.println(threadKey);
}
};
不能简单判空,因为不是同一个线程。主线程会修改,子线程不确定什么时候会用
你为什么设置为aa之后,又设置为空了呢,你设置为null的时候线程还没运行呢,一般情况下,线程不处于等待状态时,会在主函数结束后运行,你可以在thread.start之后让它睡一下sleep(10)这样就会先执行函数 了,但这也是不安全的,如果线程有个时,就算你在run里面判断为空,可能 也会出错,除非加锁,你这样的代码 我估计加个sleep就可以了
使用JDK1.8新特性吧!Optional类就是专门为了空指针异常而设计的。