java线程通信的三种方式「建议收藏」

java线程通信的三种方式「建议收藏」1、传统的线程通信。在synchronized修饰的同步方法或者修饰的同步代码块中使用Object类提供的wait(),notify()和notifyAll()3个方法进行线程通信。关于这3个方法的解释:wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或notifyAll()方法来唤醒该线程。notify():唤醒在此…

大家好,又见面了,我是你们的朋友全栈君。

1、传统的线程通信。

    在synchronized修饰的同步方法或者修饰的同步代码块中使用Object类提供的wait(),notify()和notifyAll()3个方法进行线程通信。

    关于这3个方法的解释:

    wait():导致当前线程等待,直到其他线程调用该同步监视器的notify()方法或notifyAll()方法来唤醒该线程。
    notify():唤醒在此同步监视器上等待的单个线程。
    notifyAll():唤醒在此同步监视器上等待的所有线程。

2、使用Condition控制线程通信。

    当程序使用Lock对象来保证同步,系统不存在隐式的同步监视器,只能用Condition类来控制线程通信。

     await():类似于隐式同步监视器上的wait()方法,导致当前线程等待,直到其他线程调用该Condition的signal()方法或signalAll()方法来唤醒该线程。
    signal():唤醒在此Lock对象上等待的单个线程。如果所有的线程都在该Lock对象上等待,则会选择唤醒其中一个线程。选择是任意性的。
    signalAll():唤醒在此Lock对象上等待的所有线程,只有当前线程放弃对该Lock对象的锁定后,才可以执行被唤醒的线程。

 

3、使用阻塞队列(BlockingQueue)控制线程通信(也实现了生产者消费者模式)

    BlockingQueue提供如下两个支持阻塞的方法:
    put(E e):尝试把E元素放入BlockingQueue中,如果该队列的元素已满,则阻塞该线程。
    take():尝试从BlockingQueue的头部取出元素,如果该队列的元素已空,则阻塞该线程。
    示例代码如下:
    
package edu.Utils;
 
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
 
/**
 * Created by hpp on 2017/7/4.
 */
 
class Producer extends Thread{

    private BlockingQueue<String> bq;
    public Producer(BlockingQueue<String> bq){

        this.bq = bq;
    }
    public void run(){

        String[] strArr = new String[]{

                “java”,
                “Struts”,
                “Spring”
        };
        for(int i = 0;i<99999;i++){

            System.out.println(getName() + “生产者准备生产集合元素!”);
            try{

                Thread.sleep(1000);
                bq.put(strArr[i%3]);
            }catch (Exception e){

                e.printStackTrace();
            }
            System.out.println(getName() + “生成完成:” + bq);
        }
    }
}
 
class Consumer extends Thread{

    private BlockingQueue<String> bq;
    public Consumer(BlockingQueue<String> bq){

        this.bq = bq;
    }
    public void run(){

        while(true){

            System.out.println(getName() + “消费者准备消费集合元素!”);
            try{

                Thread.sleep(1000);
                bq.take();
            }catch (Exception e){

                e.printStackTrace();
            }
            System.out.println(getName() + “消费完成:” + bq);
        }
    }
}
 
 
public class BlockingQueueTest {

 
    public static void main(String[] args){

        //创建一个容量为1的BlockingQueue
        BlockingQueue<String> bq = new ArrayBlockingQueue<String>(1);
        //启动3个生产者线程
        new Producer(bq).start();
        new Producer(bq).start();
        new Producer(bq).start();
        //启动1个消费者线程
        new Consumer(bq).start();
 
    }
 
}
运行结果:
Thread-0生产者准备生产集合元素!
Thread-1生产者准备生产集合元素!
Thread-2生产者准备生产集合元素!
Thread-3消费者准备消费集合元素!
Thread-0生成完成:[java]
Thread-0生产者准备生产集合元素!
Thread-1生成完成:[java]
Thread-1生产者准备生产集合元素!
Thread-3消费完成:[java]
Thread-3消费者准备消费集合元素!
Thread-2生成完成:[java]
Thread-2生产者准备生产集合元素!
Thread-3消费完成:[java]
Thread-3消费者准备消费集合元素!
Thread-0生成完成:[Struts]
Thread-0生产者准备生产集合元素!
Thread-3消费完成:[Struts]
Thread-3消费者准备消费集合元素!
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/150755.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • fcntl和ioctl_Liverpool fc

    fcntl和ioctl_Liverpool fc一、fcntlfcntl函数用于执行各种描述符控制操作;/*返回值:成功取决于cmd,失败返回-1;*定义:*/#includeintfcntl(intsockfd,intcmd,/*intarg*/);/*说明:*第三个参数可有可没有,根据需要给出;*/函数有下面5种功能:复制一个现有的描述符(cmd=F_DUPFD);获得/

    2025年6月22日
    3
  • MySQL8.0 – 新特性 – Descending Index

    MySQL8.0 – 新特性 – Descending Index前言在MySQL8.0之前的版本中,innodbbtree索引中的记录都是严格按照的key的顺序来存储的,但有些时候当我们需要倒序扫描时,效率就会很低。为了解决这个问题,从MySQL8.0版本开始支持在索引Key中倒序存储。你可以按照实际的sql负载来决定如何创建索引,例如你的查询中有Orderbyadesc,basc,就可以创建索引key…

    2025年6月28日
    3
  • 了解大数据

    了解大数据

    2022年3月6日
    43
  • eclipse 下载安装教程

    eclipse 下载安装教程之前已经安装了JDK还有环境变量的配置,如果没有弄的,可以看这个JDK以及环境变量配置一、下载eclipse官网的网址:eclipse下载1.有的是下载的压缩包,可以直接放到想要放的位置,解压缩就行,这你就不说了;这里主要是通过installer下载安装2.选择China下载二、安装等待安装完成就行…

    2022年6月3日
    42
  • outputstreamwriter用法_floating power object

    outputstreamwriter用法_floating power object写这个类的原因,网上有很多介绍这两个类的,InputStreamReader类的使用,没有任何异议,而OutputStreamWriter,看了网的帖子和博客说的都不是很清楚,所以小皮虾好好研究了一下OutputStreamWriter类,所以下面的总结有不对之处,欢迎指正!api类中解释:InputStreamReader是字节流通向字符流的桥梁,将字节流转换为字符流

    2025年8月28日
    9
  • android declare-styleable 和style,android – declare-styleable和style之间的区别

    android declare-styleable 和style,android – declare-styleable和style之间的区别我认为将属性声明为不是风格,只有以下区别。在attrs.xml中,您可以直接在“资源”部分内或在“declare-styleable”中声明自定义属性:所以现在我们将“attrib1”定义为不风格,“attrib2”为风格。在layout/someactivity.xml中,我们可以直接使用这些属性(不需要命名空间):您可以在style.xml声明中使用“styleable”属性“attrib…

    2022年7月14日
    18

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号