专业汉语词典知识平台,分享汉字词语知识、历史文学知识解答!

励北网
励北网

线程间通信的方式有哪些,线程间通信的几种方式

来源:小易整编  作者:小易  发布时间:2023-03-22 09:05
摘要:线程间通信的方式有哪些,线程间通信的几种方式一、使用同一个共享变量控制Synchronized、wait、notifypublicclassDemo1 privatefinalListLock、ConditionpublicclassT...

线程间通信的方式有哪些,线程间通信的几种方式

线程间通信的方式有哪些,线程间通信的几种方式

一、使用同一个共享变量控制Synchronized、wait、notify

public class Demo1 {    private final List

Lock、Condition

public class Task {    private final Lock lock = new ReentrantLock();    private final Condition addConditon = lock.newCondition();    private final Condition subConditon = lock.newCondition();    private volatile int num = 0;    private List

利用volatile

volatile修饰的变量值直接存在主内存里面,子线程对该变量的读写直接写住内存,而不是像其它变量一样在local thread里面产生一份copy。volatile能保证所修饰的变量对于多个线程可见性,即只要被修改,其它线程读到的一定是最新的值。

public class Demo2 {    private volatile List

利用AtomicInteger

和volatile类似

二、PipedInputStream、PipedOutputStream

这里用流在两个线程间通信,但是Java中的Stream是单向的,所以在两个线程中分别建了一个input和output

public class PipedDemo {    private final PipedInputStream inputStream1;    private final PipedOutputStream outputStream1;    private final PipedInputStream inputStream2;    private final PipedOutputStream outputStream2;    public PipedDemo(){        inputStream1 = new PipedInputStream();        outputStream1 = new PipedOutputStream();        inputStream2 = new PipedInputStream();        outputStream2 = new PipedOutputStream();        try {            inputStream1.connect(outputStream2);            inputStream2.connect(outputStream1);        } catch (IOException e) {            e.printStackTrace();        }    }    /**程序退出时,需要关闭stream*/    public void shutdown() throws IOException {        inputStream1.close();        inputStream2.close();        outputStream1.close();        outputStream2.close();    }    public static void main(String[] args) throws IOException {        PipedDemo demo =new PipedDemo();        new Thread(()->{            PipedInputStream in = demo.inputStream2;            PipedOutputStream out = demo.outputStream2;            for (int i = 0; i < 10; i++) {                try {                    byte[] inArr = new byte[2];                    in.read(inArr);                    System.out.print(Thread.currentThread().getName()+": "+i+" ");                    System.out.println(new String(inArr));                    while(true){                        if("go".equals(new String(inArr)))                            break;                    }                    out.write("ok".getBytes());                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();        new Thread(()->{            PipedInputStream in = demo.inputStream1;            PipedOutputStream out = demo.outputStream1;            for (int i = 0; i < 10; i++) {                try {                    out.write("go".getBytes());                    byte[] inArr = new byte[2];                    in.read(inArr);                    System.out.print(Thread.currentThread().getName()+": "+i+" ");                    System.out.println(new String(inArr));                    while(true){                        if("ok".equals(new String(inArr)))                            break;                    }                } catch (IOException e) {                    e.printStackTrace();                }            }        }).start();//        demo.shutdown();    }}

输出

Thread-0: 0 goThread-1: 0 okThread-0: 1 goThread-1: 1 okThread-0: 2 goThread-1: 2 okThread-0: 3 goThread-1: 3 okThread-0: 4 goThread-1: 4 okThread-0: 5 goThread-1: 5 okThread-0: 6 goThread-1: 6 okThread-0: 7 goThread-1: 7 okThread-0: 8 goThread-1: 8 okThread-0: 9 goThread-1: 9 ok

三、利用BlockingQueue

BlockingQueue定义的常用方法如下:

  • add(Object):把Object加到BlockingQueue里,如果BlockingQueue可以容纳,则返回true,否则抛出异常。

  • offer(Object):表示如果可能的话,将Object加到BlockingQueue里,即如果BlockingQueue可以容纳,则返回true,否则返回false。

  • put(Object):把Object加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻断直到BlockingQueue里有空间再继续。

  • poll(time):获取并删除BlockingQueue里排在首位的对象,若不能立即取出,则可以等time参数规定的时间,取不到时返回null。当不传入time值时,立刻返回。

  • peek():立刻获取BlockingQueue里排在首位的对象,但不从队列里删除,如果队列为空,则返回null。

  • take():获取并删除BlockingQueue里排在首位的对象,若BlockingQueue为空,阻断进入等待状态直到BlockingQueue有新的对象被加入为止。

BlockingQueue有四个具体的实现类:

  • ArrayBlockingQueue:数组阻塞队列,规定大小,其构造函数必须带一个int参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。

  • LinkedBlockingQueue:链阻塞队列,大小不定,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO顺序排序的。

  • PriorityBlockingQueue:类似于LinkedBlockingQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数所带的Comparator决定的顺序。

  • SynchronousQueue:特殊的BlockingQueue,它的内部同时只能够容纳单个元素,对其的操作必须是放和取交替完成的。

  • DelayQueue:延迟队列,注入其中的元素必须实现 java.util.concurrent.Delayed 接口

所有BlockingQueue的使用方式类似,以下例子一个线程写入,一个线程读取,操作的是同一个Queue:

public class BlockingQueueDemo {    public static void main(String[] args) {        LinkedBlockingQueue


本文地址:百科问答频道 https://www.neebe.cn/wenda/936767.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


百科问答
小编:小易整编
相关文章相关阅读
  • 超线程是什么意思?

    超线程是什么意思?

    超线程是一种现当代多任务处理的技术,它可以使一个物理处理器核心有效地处理两个任务或更多任务。它通过在CPU中同时执行比物理处理核心更多的虚拟线程达到其目的。这被称为“虚拟处理”。超线程不仅有助于提高CPU的性能,而且可以降低新设计物理处理...

  • 线程数是什么意思?

    线程数是什么意思?

    线程是一种轻量级的进程,被视作操作系统内一种最小单位,它被应用程序利用来组织具有不同目标的任务,避免了系统资源的浪费。线程数是指一个程序中有多少个线程在同时执行任务,即使是一个最简单的应用程序,其中也会有一个主线程在跑,而日常使用到的多线...

  • 超线程有什么用

    超线程有什么用

    超线程是可以提升cpu使用效率的。在程序支持的复情况下性能提升明显,最多30%的性制能提升。超线程技术把多线程处理器内部的两个逻辑内核模拟成两个物理芯片,让单个处理器就能使用线程级的并行计算,进而兼容多线程操作系统和软件。超线程是可以提升...

  • 超线程是什么

    超线程是什么

    超线程技术把多线程处理器内部的两个逻辑内核模拟成两个物理芯片,让单个处理器就能使用线程级的并行计算,进而兼容多线程操作系统和软件。超线程技术充分利用空闲CPU资源,在相同时间内完成更多工作。超线程(HT,Hyper-Threading...

  • 多线程是什么

    多线程是什么

    多线程是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。多线程(英语...

  • 线程间通信的方式有哪些,线程间通信的几种方式

    线程间通信的方式有哪些,线程间通信的几种方式

    线程间通信的方式有哪些,线程间通信的几种方式一、使用同一个共享变量控制Synchronized、wait、notifypublicclassDemo1{ privatefinalListLock、ConditionpublicclassT...

  • 进程线程的关系和优缺点是什么

    进程线程的关系和优缺点是什么

    进程线程的关系和优缺点是什么 进程和线程的区别是什么?有什么关系?相信大家对于进程都很熟悉了吧,而线程相对于进程而言,是一个更加接近于执行体的概念,为了让大家更好的了解进程和线程,下面给大家介绍进程和线程的区别和联系。进程和线程的区别...

  • 线程和进程的区别是什么 线程和进程的区别介绍

    线程和进程的区别是什么 线程和进程的区别介绍

    了解计算机的朋友相信对于线程和进程都比较了解,总的来说它们就像是孪生兄弟一样,让我们分不清哪个是干什么用的。其实它们各自有各自的定义,在计算机运行上,它们也是有各自的区别的。那么线程和进程的区别究竟在哪里呢?下面就让小编来仔细的讲解一下。...

  • 周排行
  • 月排行
  • 年排行

精彩推荐