首页 > 其他分享 >线程间通讯

线程间通讯

时间:2022-11-16 12:23:28浏览次数:27  
标签:通讯 Thread lock flag 线程 new wait

线程通讯的方式:

1.wait,notify等待通知

/**
 * 等待线程(调用wait方法的线程)
 */
synchronized(共享对象){ //同步代码块,进入条件是获得锁
    while(判断条件){ //进行wait线程任务的条件不满足时进入
        共享对象.wait()
    }
    线程任务代码
}

/**
 * 通知线程(调用notify方法的线程)
 */
synchronized(共享对象){ //同步代码块,进入条件是获得锁
    线程任务代码
    改变wait线程任务的条件
    共享对象.notify()
}





具体例子
public class WaitNotify {
    static boolean flag = true; //等待线程继续执行往下执行的条件
    static Object lock = new Object(); //上锁的对象

    public static void main(String[] args) throws InterruptedException {
        Thread waitThread = new Thread(new WaitRunnable(),"waitThread");   //以WaitRunnable为任务类的线程
        Thread notifyThread = new Thread(new NotifyRunnable(),"notifyThread");   //以NotifyRunnable为任务类的线程
        waitThread.start(); //wait线程启动
        Thread.sleep(2000); //主线程休眠2s
        notifyThread.start(); //notify线程启动
    }

    /**
     * Runnable等待实现类
     * synchronized关键字:可以修饰方法或者以同步块的形式来使用
     */
    static class WaitRunnable implements Runnable{
        @Override
        public void run() {
            //对lock加锁
            synchronized(lock){
                //判断,若flag为true,则继续等待(wait)
                while(flag){
                    try {
                        System.out.println(
                                Thread.currentThread().getName()+
                                "---flag为true,等待 @"+
                                new SimpleDateFormat("hh:mm:ss").format(new Date())
                        );
                        lock.wait(); //等待,并释放锁资源
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //若flag为false,则进行工作
                System.out.println(
                        Thread.currentThread().getName()+
                        "---flag为false,运行 @"+
                        new SimpleDateFormat("hh:mm:ss").format(new Date())
                );
            }
        }
    }

    /**
     * Runnable通知实现类
     */
    static class NotifyRunnable implements Runnable{
        @Override
        public void run(){
            //对lock加锁
            synchronized(lock){
                //以NotifyRunnable为任务类的线程释放lock锁,并进行通知后,以Wait为任务类的线程才可以跳出循环
                System.out.println(
                        Thread.currentThread().getName()+ 
                        "---当前持有锁,释放 @"+
                        new SimpleDateFormat("hh:mm:ss").format(new Date())
                );
                lock.notifyAll(); //通知所有正在等待的线程从wait返回
                flag = false;
                try {
                    Thread.sleep(5000); //notifyThread线程休眠5s
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            //再次对lock加锁,并休眠
            synchronized (lock){
                System.out.println(
                        Thread.currentThread().getName()+
                        "---再次持有锁,休眠 @"+
                        new SimpleDateFormat("hh:mm:ss").format(new Date())
                );
                try {
                    Thread.sleep(2000); //再次让notifyThread线程休眠2s
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}


//该代码示例来自《Java并发编程的艺术》

 

 

2.volatile共享内存,读写都会刷新线程私有内存

参考自:牛客

标签:通讯,Thread,lock,flag,线程,new,wait
From: https://www.cnblogs.com/northli/p/16895470.html

相关文章

  • 河北稳控科技振弦采集模块AABB 通讯协议
    河北稳控科技振弦采集模块AABB通讯协议 AABB通讯协议是一种非标准自定义协议,相较于MODBUS通讯协议,结构更简单,指令生成方法更容易,便于进行快速测试。AABB通讯协......
  • 多线程下带事务的删除大量数据引起的锁等待超时
    @Override@Transactional(readOnly=false,propagation=Propagation.REQUIRES_NEW)//我建议不要用这个注解,他是声明式事务粒度过大,建议用使用编程式事务,可控性......
  • 还不懂Java线程池实现原理,看这一篇文章就够了
    线程池无论是工作还是面试都是必备的技能,但是很多人对于线程池的实现原理却一知半解,并不了解线程池内部的工作原理,今天一灯就带大家一块剖析线程池底层实现原理。1.为什......
  • 并发-线程池[老的,有时间我重新整理一下]
    并发-线程池[老的,有时间我重新整理一下]文章是直接从我本地word笔记粘贴过来的,排版啥的可能有点乱,凑合看吧,有时间我会慢慢整理为什么要用线程池?平时开发的时候基本不太......
  • 如何实现PC构件产线与混凝土送料小车之间无线通讯?
    近年来,“装配式建筑”已成为我国建筑行业转换生产方式的新方向。作为装配式建筑体系的重要环节,混凝土建筑部品预制化生产也进入新的发展时期,机械化操作,完成楼房外墙板、内墙......
  • 如何实现PC构件产线与混凝土送料小车之间无线通讯?
    近年来,“装配式建筑”已成为我国建筑行业转换生产方式的新方向。作为装配式建筑体系的重要环节,混凝土建筑部品预制化生产也进入新的发展时期,机械化操作,完成楼房外墙板、内墙......
  • python 线程池 ThreadPoolExecutor
    从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了ThreadPoolExecutor(线程池)和ProcessPoolExecutor(进程池)两个类。相比threading等模块,该模......
  • CS149ass2线程池+计算图
    CS149ass2线程池+计算图任务描述实现线程池,要求同时实现一个spin和sleep的线程池。要求实现一个计算图,任务按照顺序完成我的收获这个assign不算难,主要目的就是......
  • 异步编排 Spring(线程池)
    目录异步编排CompletableFuture的详解代码测试配置类的引入Demo1Demo2CompletableFuture的async后缀函数与不带async的函数的区别ThreadPoolTaskExecutor和ThreadPoolEx......
  • 异步和多线程有什么区别
    一、异步和多线程有什么区别?其实,异步是目的,而多线程是实现这个目的的方法。 多线程和异步操作两者都可以达到避免调用线程阻塞的目的,从而提高软件的可响应性。甚至......