线程间协作

上代码:

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休眠同时释放掉锁(运行结果两个都有)

发布了91 篇原创文章 · 获赞 8 · 访问量 4750

猜你喜欢

转载自blog.csdn.net/niuxikun/article/details/104511039
今日推荐