快捷搜索: 王者荣耀 脱发

线程间通信最好的例子(自认为)

1.需求:当list的长度不等于5时,开始等待wait,当等于5时,唤醒

2.代码

2.1定义waitdemo类

/**
 * 线程通信
 */
public class WaitDemo {
	static List<String> list = new ArrayList<String>();
	public static void add(){
		list.add("anything");
	}
	public static int size(){
		return list.size();
	}
		
}

2.2定义threada类

public class ThreadA implements Runnable {
	private Object obj;
	public ThreadA(Object obj) {
		super();
		this.obj = obj;
	}

	@Override
	public void run() {
		synchronized (obj) {
			if(WaitDemo.size()!=5){
				System.out.println("wait begin"+System.currentTimeMillis());
				try {
					obj.wait();
					System.out.println("wait end"+System.currentTimeMillis());
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

2.3定义threadb类

public class ThreadB implements Runnable {
	private Object obj;
	public ThreadB(Object obj) {
		super();
		this.obj = obj;
	}
	@Override
	public void run() {
		synchronized (obj) {
			for(int i=0;i<10;i++){
				WaitDemo.add();
				if(WaitDemo.size()==5){
					obj.notify();
					System.out.println("已经发出通知了");
				}
				System.out.println("添加了"+(i+1)+"个元素");
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

}

2.4测试

public class Test {
	public static void main(String[] args) throws InterruptedException {
		Object obj = new Object();
		ThreadA threadA = new ThreadA(obj);
		ThreadB threadB = new ThreadB(obj);
		Thread thread1 = new Thread(threadA);
		Thread thread2 = new Thread(threadB);
		thread1.start();
		Thread.sleep(1000);
		thread2.start();
		
	}
}

2.5输出结果

wait begin1525533680484
添加了1个元素
添加了2个元素
添加了3个元素
添加了4个元素
已经发出通知了
添加了5个元素
添加了6个元素
添加了7个元素
添加了8个元素
添加了9个元素
添加了10个元素
wait end1525533691268
总结和练习,是最好的方法,时间长不用就开始忘
经验分享 程序员 微信小程序 职场和发展