Java中多线程间的通信是怎么实现的?

线程通信的方式:

(1)共享变量

  线程之间的通信可以通过发送信号,发送信号的一个简单方法就是再共享的对象里面设置信号值。线程A在一个同步块中设置boolean型的成员变量hasDataToProcess为true,线程B在同步块中读取hasDataProcess的值,如下:

package com.itheima.threadTest;

public class ThreadtTest {
//共享的变量
private boolean hasDataToProcess=false;
//取值
public boolean getHasDataToProcess() {
return hasDataToProcess;
}
//设值
public void setHasDataToProcess(boolean hasDataToProcess) {
this.hasDataToProcess = hasDataToProcess;
} public static void main(String[] args) {
//创建一个对象
final ThreadtTest my=new ThreadtTest();
//线程1设置hasDataToProcess的值为true
final Thread t1=new Thread(new Runnable() {
@Override
public void run() {
my.setHasDataToProcess(true); }
}); //线程1开始执行
t1.start(); //线程2取值
Thread t2=new Thread(new Runnable() {
@Override
public void run() {
try {
//等待线程1执行完
t1.join();
}catch (Exception e) {
e.printStackTrace();
} my.getHasDataToProcess(); System.out.println("t1改变后的值:"+my.getHasDataToProcess());
}
});
t2.start();
}

(2)wait/notify机制

  生成者消费者案例

package com.itheima.threadTest;

//资源类
class Resource{
private String name;
private int count=1;
//标志位
private boolean flag=false; //当标识位为false时是生产者执行,为true是消费者执行 //生成资源
public synchronized void set(String name) {
//根据标志位判断是否到自己执行了
while(flag) {
//标志位为true时,生产者等待,消费者执行
try {
//注意如果是同步代码块的话,就要使用锁住的那个对象来调用wait()
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} //如果到自己执行了
this.name=name+"---"+count++;
System.out.println(Thread.currentThread().getName()+"....生产者......."+this.name); //修改标识位
flag=true;
//唤醒其他等待的线程
this.notifyAll();
} //消费资源
public synchronized void out() {
//判断标识位
while(!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
} System.out.println(Thread.currentThread().getName()+".....消费者......."+this.name); flag=false;
this.notifyAll();
} } //生产者线程
class Producer implements Runnable{
private Resource res;
Producer(Resource res){
this.res=res;
}
//生成者生成资源
@Override
public void run() {
for(int i=0;i<5;i++){
res.set("商品!");
} }
} //消费者消费资源
class Consumer implements Runnable{
private Resource resource;
public Consumer(Resource resource) {
this.resource=resource;
}
@Override
public void run() {
for(int i=0;i<5;i++) {
resource.out();
} }
} public class ProducerConsumerDemo {
public static void main(String[] args) {
//参加一个公共资源
Resource r=new Resource(); //两个线程
Producer producer=new Producer(r);
Consumer consumer=new Consumer(r);
Thread t1=new Thread(producer);
Thread t2=new Thread(consumer); t1.start();
t2.start();
}
}

  运行结果:

Java线程——线程之间的通信的更多相关文章

  1. java和C#之间SOCKET通信的问题

    转自:http://www.cdtarena.com/javapx/201307/9170.html java和C#之间SOCKET通信的问题 一.服务器端(使用java编写) /** * 监听客户端 ...

  2. 关于Java和.NET之间的通信问题(JSON)

    前言: 最近项目在某XX领导的所谓指引下,非要转型Java,转就转吧,在转的过程前期是个痛苦期,特别.NET旧有项目和Java新项目需要通信时. 进入主题,Java和.NET之间需要通信,这时媒介很多 ...

  3. Java多线程编程-线程之间的通信

    转载自:这里 学习了基础的线程知识 看到了 线程之间的通信 线程之间有哪些通信方式呢? 1.同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public ...

  4. java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)

    CPU:10核 主频100MHz 1核  主频    3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...

  5. java并发学习--第六章 线程之间的通信

    一.等待通知机制wait()与notify() 在线程中除了线程同步机制外,还有一个最重要的机制就是线程之间的协调任务.比如说最常见的生产者与消费者模式,很明显如果要实现这个模式,我们需要创建两个线程 ...

  6. Thread线程源码解析,Java线程的状态,线程之间的通信

    线程的基本概念 什么是线程 现代操作系统在运行一个程序的时候,会为其创建一个进程.例如,启动一个Java程序,操作系统就会创建一个Java进程.线代操作系统调度的最小单位是线程.也叫做轻量级进程.在一 ...

  7. Java学习笔记46(多线程三:线程之间的通信)

    多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个 ...

  8. java线程之间的通信

    1.常用的方法 sleep() 该线程进入等待状态,不释放锁 wait() 该线程进入等待状态,释放锁 notify() 随机唤醒一个线程 notifyAll() 唤醒全部线程 getName() 获 ...

  9. java多线程通过管道流实现不同线程之间的通信

    java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...

随机推荐

  1. c# copydata 消息

    using PublicCode; using System; using System.Collections.Generic; using System.ComponentModel; using ...

  2. [BJDCTF2020]EasySearch

    0x00 知识点 Apache SSI 远程命令执行漏洞 链接: https://www.cnblogs.com/yuzly/p/11226439.html 当目标服务器开启了SSI与CGI支持,我们 ...

  3. 【剑指Offer】面试题32 - III. 从上到下打印二叉树 III

    题目 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20,nu ...

  4. ffmpeg 多路实时问题之解决思路

     记得前面有人提出多路视频不实时问题,这个首先需要从网络带宽上查看是否视频帧全实时的到达,还有一个问题就是,即使视频帧全部到达,看起CPU也是足够的,但是却表现为慢镜头这种样子,那么很可能是解码显示的 ...

  5. 存储器HK1225-7EQ 使用说明书资料

    一. 引脚排列 二. 读取模式 HK1225在WE(写使能)被禁止(high)且CE(片选)被选中(Low)且CE2(片选2)被选中(High)并且OE(读信号)被使能(Low)执行一次读循环.13个 ...

  6. Linux下部署开源版“禅道”项目管理系统《转载》

    Linux下部署开源版“禅道”项目管理系统 https://www.cnblogs.com/xxsl/p/6525378.html

  7. MacType

    #前言 这几天实在是嫌弃Win10垃圾的字体渲染效果--发虚模糊,索性从网上找了个系统字体渲染软件即MacType给系统字体改头换面. #使用效果 这里贴出两个场景的效果对比(单击图片查看具体效果) ...

  8. opencv.js双边滤波 磨皮处理

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...

  9. PHP数据库基础(简单的)

    经常用到的函数 $link=mysql_connect("数据库地址","用户名","密码");//链接数据库mysql_query(“se ...

  10. CCCC L2-004. 这是二叉搜索树吗?

    题意: 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓 ...