线程间通信最好的例子(自认为)
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项目控制台中文乱码