1.线程通信
概念:线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号,多个线程在处理同一个资源,并且任务不同时,需要线程通信来帮助解决线程之间对同一个变量的使用或操作。就是多个线程在操作同一份数据时, 避免对同一共享变量的争夺。于是我们引出了等待唤醒机制:(wait()、notify())就是在一个线程进行了规定操作后,就进入等待状态(wait), 等待其他线程执行完他们的指定代码过后 再将其唤醒(notify);
注意:
1.wait()、notify() 必须配合synchronized关键字使用
2.wait()释放锁、notify()不释放锁。
public class WaitAndNotify { private volatile static List list=new ArrayList(); public void add(){ list.add("suonanjiexi"); } public int size(){ return list.size(); } public static void main(String[] args) { final WaitAndNotify waitAndNotify=new WaitAndNotify(); final Object lock=new Object(); Thread t1=new Thread(new Runnable() { @Override public void run() { synchronized (lock){ try{ for (int i = 0; i <10 ; i++) { waitAndNotify.add(); System.out.println("当前线程:"+Thread.currentThread().getName()+"添加一个元素..."); Thread.sleep(500); if (waitAndNotify.size()==5){ System.out.println("已经发出通知..."); lock.notify(); } } } catch (Exception e){ e.printStackTrace(); } } } },"t1"); Thread t2=new Thread(new Runnable() { @Override public void run() { synchronized (lock){ try{ if(waitAndNotify.size()!=5){ lock.wait(); } System.out.println("当前线程:"+Thread.currentThread().getName()+"收到通知线程停止..."); throw new RuntimeException(); } catch (Exception e){ e.printStackTrace(); } } } },"t2"); t2.start(); t1.start(); } }
实现实时的通知
public class WaitAndNotify { private volatile static List list=new ArrayList(); final static CountDownLatch countDownLatch=new CountDownLatch(1); public void add(){ list.add("suonanjiexi"); } public int size(){ return list.size(); } public static void main(String[] args) { final WaitAndNotify waitAndNotify=new WaitAndNotify(); final Object lock=new Object(); Thread t1=new Thread(new Runnable() { @Override public void run() { //synchronized (lock){ try{ for (int i = 0; i <10 ; i++) { waitAndNotify.add(); System.out.println("当前线程:"+Thread.currentThread().getName()+"添加一个元素..."); Thread.sleep(500); if (waitAndNotify.size()==5){ System.out.println("已经发出通知..."); countDownLatch.countDown(); //lock.notify(); } } } catch (Exception e){ e.printStackTrace(); } //} } },"t1"); Thread t2=new Thread(new Runnable() { @Override public void run() { //synchronized (lock){ try{ if(waitAndNotify.size()!=5){ countDownLatch.await(); //lock.wait(); } System.out.println("当前线程:"+Thread.currentThread().getName()+"收到通知线程停止..."); throw new RuntimeException(); } catch (Exception e){ e.printStackTrace(); } // } } },"t2"); t2.start(); t1.start(); } }