首页 > 其他分享 >03 - 多线程之间如何实现通讯

03 - 多线程之间如何实现通讯

时间:2022-08-17 12:56:21浏览次数:83  
标签:03 通讯 Thread res 线程 new 多线程 public wait

Java 多线程之间如何实现通讯

多个线程之间通过wait,notify通讯

public class Thread007 {
    class Res {
        public String userName;
        public char userSex;
        public boolean flag;
    }

    class InputThread extends Thread {
        private Res res;
        
        public InputThread(Res res) {
            this.res = res;
        }

        @Override
        public void run() {
            try {
                int count = 0;
                while (true) {
                    synchronized (res) {
                        if (this.res.flag) {
                            res.wait();
                        }
                        if (count == 0) {
                            this.res.userName = "小薇";
                            this.res.userSex = '女';
                        } else {
                            this.res.userName = "余胜军";
                            this.res.userSex = '男';
                        }
                        this.res.flag = true;
                        this.res.notify();
                    }
                    count = (count + 1) % 2;
                }
            } catch (Exception e) {
            }
        }
    }

    class OutThread extends Thread {
        private Res res;

        public OutThread(Res res) {
            this.res = res;
        }

        @Override
        public void run() {
            while (true) {
                try {
                    synchronized (res) {
                        if (!res.flag) {
                            res.wait();
                        }
                        System.out.println(res.userName + "," + res.userSex);
                        res.flag = false;
                        res.notify();
                    }
                } catch (Exception e) {
                }
            }
        }
    }

    public static void main(String[] args) {
        new Thread007().start();
    }

    private void start() {
        Res res = new Res();
        InputThread inputThread = new InputThread(res);
        OutThread outThread = new OutThread(res);
        inputThread.start();
        outThread.start();
    }
}

Wait、Notify()用法

  1. 因为涉及到对象锁, wait、Notify 必须要在synchronized中使用

  2. Wait会暂停当前线程,释放cpu执行资格,同时释放锁。

  3. Notify 唤醒锁池正在等待的线程

wait和sleep的区别

都是可以让当前的线程变为阻塞状态。

wait可以释放锁。

为什么wait要放在object类

因为 synchronized 可以使用任意对象作为锁。

多线程 join

使用 join,报这个线程的顺序问题,比如有A和B两个线程,如果在B线程调用A.join方法,B线程会阻塞同时释放锁,则必须先让A线程执行完毕,才能执行B线程,底层通过wait和notify实现。

public class Thread009 implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "," + i);
        }
    }

    public static void main(String[] args) {
        Thread t1 = new Thread(new Thread009(), "t1");
        Thread t2 = new Thread(new Thread009(), "t2");
        Thread t3 = new Thread(new Thread009(), "t3");
        try {
            t1.start();
            // 主线程调用 t1.join(),主线程变为阻塞状态,同时释放锁,必须等待t1线程执行完毕的情况下,主线程才能继续执行
            t1.join();
            t2.start();
            t2.join();
            t3.start();
            t3.join();
            for (int i = 0; i < 10; i++) {
                System.out.println(Thread.currentThread().getName() + "," + i);
            }
            // 这样,最终效果跟单线程一样
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

标签:03,通讯,Thread,res,线程,new,多线程,public,wait
From: https://www.cnblogs.com/YeQuShangHun/p/16594737.html

相关文章

  • MFC实现Txt03之CRichEditView实现文本拖拽功能
    02实现了基本的Txt操作功能,现在还想加一个拖拽功能,即把一个Txt文本拖拽进来,然后自动打开该文本。(参考Txt拖拽,不理解的话就试一下,就是把另一个Txt拖到一个已打开的Txt中) ......
  • 奇淫巧技,CompletableFuture 异步多线程是真的优雅
     一个示例回顾Future一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度。JDK5新增了Future接口,用于描述一个异步计算的结果。虽然Future以及相关使用......
  • 多线程和异步
    多线程和异步异步方法—Async、Await 一:前言1.所有带有Async关键字的异步方法返回类型:① Task<T>:如果调用方法想通过调用异步方法获取一个T类型的返回值,......
  • request.js?b775:101 Uncaught (in promise) Error: Failed to convert value of type
    request.js?b775:101Uncaught(inpromise)Error:Failedtoconvertvalueoftype'java.lang.String'torequiredtype'java.lang.Long';nestedexceptionisjava......
  • java: 非法字符: '\ufeff'
    在Idea中启动项目报错:java:非法字符:'\ufeff',原因时,是由于idea在编译期间字符集乱码。解决方式如下:1、在Idea右下角选择对应的编码 2、进行reload    ......
  • 数据库03
    目录约束条件主键auto_increment自增外键一对一一对多多对多作业约束条件主键1.定义:InnoDB存储引擎规定每个表都存在有且只有一个主键不被指定时InnoDB存储引擎会提供......
  • React报错之Type '() => JSX.Element[]' is not assignable to type FunctionComponen
    正文从这开始~总览当我们尝试从函数组件中返回元素组成的数组时,会产生"Type'()=>JSX.Element[]'isnotassignabletotypeFunctionComponent"错误。为了解决该错误......
  • ModuleNotFoundError: No module named 'pygal.i18n'
    1.问题:ModuleNotFoundError:Nomodulenamed'pygal.i18n'  2.解决方法:File->Settings->点击底部加号(+)->AvaiablePackages->pygal-maps_world->installPackage......
  • Let's Go系列---channel的用法及原理
    基本语法创建channelch1:=make(chanstruct{})ch2:=make(chanint,10)读写channel从channel中读取数据叫做recv;向channel写数据叫做send。//发送数据到channel......
  • SpringMvc_03RestuFul风格
    概念:Restful就是一个资源定位以及资源操作的风格,不是标准也不是协议,只是一种风格,基于这个风格的软件可以更简洁,更有层次,更易于实现缓存机制。功能资源:互联网所有的事务......