多线程通信 wait和notify Love The Way You Lie 2023-08-17 17:33 61阅读 0赞 一、概念 线程是操作系统中独立的个体,这些线程如果不通过特殊的手段进行处理,就无法组成一个完整的整体。因此线程通信就称为组成一个整体的必须条件之一。当线程之间存在通信,那么系统之间的交互就会更加强大。在提高CPU使用率的前提下,会使开发人员对线程任务在开发的过程中进行有效的把控和监督。 使用wait/notify实现线程之间的通信。这两个方法都是Object的类方法。也就是java的所有对象都提供了这两个方法。 wait/notify必须配合关键字synchronize使用 wait方法是释放锁,notify方法是不释放锁 1.异步通信 import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; public class ListAdd2 { private volatile static List list = new ArrayList(); public void add(){ list.add("bjsxt"); } public int size(){ return list.size(); } public static void main(String[] args) { final ListAdd2 list2 = new ListAdd2(); final Object lock = new Object(); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { synchronized (lock) { System.out.println("t1启动.."); for(int i = 0; i <10; i++){ list2.add(); System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素.."); Thread.sleep(500); if(list2.size() == 5){ System.out.println("已经发出通知.."); lock.notify(); } } } } catch (InterruptedException e) { e.printStackTrace(); } } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (lock) { System.out.println("t2启动.."); if(list2.size() != 5){ try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("当前线程:" + Thread.currentThread().getName() + "收到通知线程停止.."); throw new RuntimeException(); } } }, "t2"); t2.start(); // 注意此处,t2线程先启动 t1.start(); } } 2.实时通信 public class ListAdd3 { private volatile static List list = new ArrayList(); final static CountDownLatch countDownLatch = new CountDownLatch(1); // 数字表示发起几次通知,线程才会被唤醒,如果为2,则需要写两次通知,如代码中注释 public void add(){ list.add("bjsxt"); } public int size(){ return list.size(); } public static void main(String[] args) { final ListAdd3 list2 = new ListAdd3(); final Object lock = new Object(); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { // synchronized (lock) { System.out.println("t1启动.."); for(int i = 0; i <10; i++){ list2.add(); System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素.."); Thread.sleep(500); if(list2.size() == 5){ System.out.println("已经发出通知.."); countDownLatch.countDown(); //countDownLatch.countDown(); // 如果括号中数字为2,则这里写几次 // lock.notify(); } } // } } catch (InterruptedException e) { e.printStackTrace(); } } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { //synchronized (lock) { System.out.println("t2启动.."); if(list2.size() != 5){ try { //lock.wait(); countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("当前线程:" + Thread.currentThread().getName() + "收到通知线程停止.."); throw new RuntimeException(); } // } }, "t2"); t2.start(); t1.start(); } } import java.util.ArrayList; import java.util.List; public class ListAdd1 { private volatile static List list = new ArrayList(); public void add(){ list.add("bjsxt"); } public int size(){ return list.size(); } public static void main(String[] args) { final ListAdd1 list1 = new ListAdd1(); Thread t1 = new Thread(new Runnable() { @Override public void run() { try { for(int i = 0; i <10; i++){ list1.add(); System.out.println("当前线程:" + Thread.currentThread().getName() + "添加了一个元素.."); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { while(true){ if(list1.size() == 5){ System.out.println("当前线程收到通知:" + Thread.currentThread().getName() + " list size = 5 线程停止.."); throw new RuntimeException(); } } } }, "t2"); t1.start(); t2.start(); } }
还没有评论,来说两句吧...