线程间通信最好的例子(自认为)
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总结和练习,是最好的方法,时间长不用就开始忘
上一篇:
			            IDEA上Java项目控制台中文乱码 
			          
			          
			        
