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)
上一篇 2022年6月19日 下午8:36
下一篇 2022年6月19日 下午8:46


相关推荐

  • data gateway_交通运输部监测调度

    data gateway_交通运输部监测调度对于大数据场景,计算的业务逻辑基本都在数据处理过程中完成,最后往往会持久化下来计算的结果,存储在mysql,es,hbase等适合提供查询的地方。而对于在不同数据库上的数据,需要开发接口,管理接口也是一个不小的工作量。Dataway的出现,正好解决了这个场景下的接口开发,管理等问题。只需要通过SQL,Dataql等配置就能完成一个接口的上线,大大提高了开发效率,以及管理成本。对于数据中台建设中,Dataway可以使用在统一服务层,对接各种数据源,管理数据出口。一、安装引入依赖Da…

    2025年6月1日
    6
  • 使用树莓派gpio连接ps2手柄模块(附程序)「建议收藏」

    使用树莓派gpio连接ps2手柄模块(附程序)「建议收藏」最近,在学习使用树莓派的gpio,想直接通过树莓派直接控制ps2游戏手柄,但是在网上资料较少。直到发现了这个参考资料,我修改了一小部分代码,实现直接使用树莓派自带的gpio库函数来调用。#TheseareourbuttonconstantsimporttimeimportRPi.GPIOasgpioPSB_SELECT=1PSB_L3=2PSB_R3=3PSB_START=4PSB_PAD_UP=5PSB_PAD_RIGHT=6PSB_PAD

    2022年6月1日
    55
  • CSS半透明边框效果

    CSS半透明边框效果源代码:&lt;!doctypehtml&gt;&lt;html&gt;&lt;head&gt;&lt;metacharset="utf-8"&gt;&lt;style&gt;div{ width:500px; height:309px; border:50pxsolidhsla(0,0%,100%,0.5); background:url(file:///C:/Use…

    2022年7月13日
    12
  • docker nginx挂载目录_挂载成功之后如何安装

    docker nginx挂载目录_挂载成功之后如何安装创建目录一般将nginx目录挂载到宿主机方便操作,创建nginx目录:mkdir/home/dockernginxmkdir/home/dockernginx/{conf,html,logs}创建nginx配置文件如下:vim/home/dockernginx/conf/nginx.confnginx默认配置如下:usernginx;worker_processesauto;error_log/var/log/nginx/error.lognotice;pi

    2022年8月20日
    12
  • MATLAB函数fir1「建议收藏」

    MATLAB函数fir1「建议收藏」fir1基于窗函数的fir滤波器设计;主要形式:b=fir1(n,Wn)b=fir1(n,Wn,ftype)b=fir1(___,window)b=fir1(___,scaleopt)系数的含义n—滤波器阶数。Wn—截止频率,0≤Wn≤1,Wn=1对应于采样频率的一半。当设计带通和带阻滤波器时,Wn=[W1W2],W1≤…

    2022年7月17日
    37
  • 《算法和数据结构》算法篇

    《算法和数据结构》算法篇数据结构 动态规划 基础排序 暴力算法

    2026年3月18日
    2

发表回复

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

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