上代码:
package keeper;
import java.util.Date;
public class Test {
private static String time;
static class Display extends Thread{
@Override
public void run() {
System.out.println(time);
}
}
static class Time extends Thread{
@Override
public void run() {
time = new Date().toString();
}
}
public static void main(String[] args) {
new Time().start();
new Display().start();
}
}
运行结果为null
原因:
假如Display方法先执行,因为Display方法里面包含Time方法,而Time方法没有执行,所以输出为null
解决办法:Display添加if方法
static class Display extends Thread{
@Override
public void run() {
if(time == null) {
try {
sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(time);
}
}
还有一种方法:
package keeper;
import java.util.Date;
public class Test {
private static String time;
static class Display extends Thread{
Time timeThread;
Display(Time time){
this.timeThread = time;
}
@Override
public void run() {
if(time == null) {
/*try {
sleep(15);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
try {
timeThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println(time);
}
}
static class Time extends Thread{
@Override
public void run() {
time = new Date().toString();
}
}
public static void main(String[] args) {
Time time= new Time();
time.start();
new Display(time).start();
}
}
这里面有个问题:
A执行完毕后,B死了怎么办,因为这里有join照样可以执行。
更新版:
package keeper;
import java.util.Date;
public class Test {
private static String time;
static class Display extends Thread{
Time timeThread;
Object object;
Display(Time time,Object object){
this.timeThread = time;
this.object = object;
}
@Override
public void run() {
if(time == null) {
synchronized (time) {
try {
object.wait();//线程执行该方法,则该线程阻塞,
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
System.out.println(time);
}
}
static class Time extends Thread{
Object object;
Time(Object object){
this.object = object;
}
@Override
public void run() {
time = new Date().toString();
synchronized (time) {
object.notify();
}
}
}
public static void main(String[] args) {
final Object OBJECT = new Object();
Time time= new Time(OBJECT);
time.start();
new Display(time,OBJECT).start();
}
}
扫描二维码关注公众号,回复:
9658834 查看本文章
如上图:当执行A时,线程阻塞,同时释放掉锁,让B可以执行。
这里还有一个例子:
sleep只休眠不释放掉锁(所以运行结果只有一号打印机)
wait休眠同时释放掉锁(运行结果两个都有)