Java并发编程---线程之间的通信问题 曾经终败给现在 2022-06-03 10:59 186阅读 0赞 **一.线程之间的通信** **1.概念** 线程是操作系统中独立的个体,但这些如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体的必用方式之一.当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时还会使开发人员对线程任务在处理的过程中进行有效的把控和监督. **2.代码示例** **2.1原生方式实现线程通信** package com.thread.message; import java.util.ArrayList; import java.util.List; public class ListAdd1 { /**volatile加与不加的区别,可以换做notify与wait来代替*/ 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) { // TODO Auto-generated method stub final ListAdd1 list1 = new ListAdd1(); Thread t1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { for (int i = 0; i < 10; i++) { list1.add(); System.out.println("当前线程: " + Thread.currentThread().getName() + "添加了一个元素.."); Thread.sleep(1000); } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while(true){ if(list1.size() == 5){ System.out.println("当前线程收到通知: " + Thread.currentThread().getName() + "list size = 5 线程停止..."); throw new RuntimeException(); } } } },"t2"); t1.start(); try { Thread.sleep(5); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t2.start(); } } **2.2 使用wait/notify方法实现线程间的通信** package com.thread.message; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CountDownLatch; import org.omg.Messaging.SyncScopeHelper; /** * wait notify方法 , wait释放锁,notify不释放锁 * 使用同一对象的锁 * @author Administrator * */ 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) { // TODO Auto-generated method stub final ListAdd2 list2 = new ListAdd2(); // 1.实例化出来一个lock // 当使用wait和notify的时候,一定要配合着synchronized关键字去使用 final Object lock = new Object(); // 把对象当成一把锁 final CountDownLatch countDownLatch = new CountDownLatch(1); Thread t1 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { synchronized (lock) { 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(); //发出通知,并非锁,只是一个标志 lock.notify(); } } } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }, "t1"); Thread t2 = new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub synchronized (lock) { //代码块加锁 if (list2.size() == 5) { try { System.out.println("t2进入... "); // countDownLatch.await(); lock.wait(); //收到notif通知这块就往下走 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("当前线程收到通知: " + Thread.currentThread().getName() + "收到通知 线程停止..."); throw new RuntimeException(); } } }, "t2"); t2.start(); try { Thread.sleep(5); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } t1.start(); } } **3.代码分析** 使用wait/notify方法实现线程间的通信.(注意这两个方法都是Object类的方法.换句话说,Java为所有的对象都提供了这两个方法) 3.1 wait和notify必须配合synchronized关键字使用 3.2 wait方法释放锁,notify方法不释放锁
相关 Java并发编程:线程同步与通信的常见问题 在Java并发编程中,线程同步和通信是常遇到的问题。以下是一些常见的问题及其解决方案: 1. **竞态条件**: - 例如,多个线程同时访问和修改共享数据。 - 短命女/ 2024年09月20日 20:39/ 0 赞/ 5 阅读
相关 并发编程的挑战:Java线程通信问题解析 Java线程通信是并发编程中的一个重要部分,主要是为了实现多个线程之间的数据共享和协调。下面我们就常见的几种线程通信方式进行解析。 1. **共享变量**: - Jav 拼搏现实的明天。/ 2024年09月15日 01:15/ 0 赞/ 17 阅读
相关 并发编程之坑:Java线程通信阻塞问题 在Java的并发编程中,线程通信阻塞问题是一个常见的陷阱。这里简单解释一下: 1. **条件等待**: 在多线程环境中,一个线程需要满足某个特定条件才能执行下一步操作。 短命女/ 2024年09月10日 02:15/ 0 赞/ 15 阅读
相关 并发编程——线程通信 在说明线程通信前,我们有必要对进程通信进行了解。 1、进程通信方法 进程间通信的方法主要有以下几种: (1)无名管道( pipe ) 管道是一种半双工的通信方式,数据只 绝地灬酷狼/ 2022年10月01日 00:39/ 0 赞/ 179 阅读
相关 并发编程(6)-线程之间的通信 线程通信的概念:线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程之间的通信就成为整体的比用方法之一。当线程存在通信指挥,系统间的交互性会更强大 快来打我*/ 2022年06月06日 09:11/ 0 赞/ 159 阅读
相关 Java并发编程---线程之间的通信问题 一.线程之间的通信 1.概念 线程是操作系统中独立的个体,但这些如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体的必用方式之一.当线程存在通信指挥,系统间 曾经终败给现在/ 2022年06月03日 10:59/ 0 赞/ 187 阅读
相关 并发编程-线程之间通信 多个线程在操作同一个资源 synchronized wait、notify(一定要在线程同步中使用,并且是同一个锁的资源。wait释放锁,notify不释放锁 柔情只为你懂/ 2022年02月22日 03:28/ 0 赞/ 261 阅读
相关 Java并发学习 7: 线程之间的通信 文章目录 7. 线程之间的通信 7.1 synchronized和volatile关键字 7.2 wait()和notify()方法进行线 灰太狼/ 2022年02月21日 00:23/ 0 赞/ 252 阅读
相关 Java之间线程的通信 Java之间线程的通信 篮子 生产者 消费者 测试类 篮子里面放水果,默认没有水果。生产者生产水果之后进入等待状态,并通知消费者购买水果。 你的名字/ 2022年01月27日 08:01/ 0 赞/ 339 阅读
还没有评论,来说两句吧...