Java线程——线程之间的通信
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线程——线程之间的通信的更多相关文章
- java和C#之间SOCKET通信的问题
转自:http://www.cdtarena.com/javapx/201307/9170.html java和C#之间SOCKET通信的问题 一.服务器端(使用java编写) /** * 监听客户端 ...
- 关于Java和.NET之间的通信问题(JSON)
前言: 最近项目在某XX领导的所谓指引下,非要转型Java,转就转吧,在转的过程前期是个痛苦期,特别.NET旧有项目和Java新项目需要通信时. 进入主题,Java和.NET之间需要通信,这时媒介很多 ...
- Java多线程编程-线程之间的通信
转载自:这里 学习了基础的线程知识 看到了 线程之间的通信 线程之间有哪些通信方式呢? 1.同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. public ...
- java之线程(线程的创建方式、java中的Thread类、线程的同步、线程的生命周期、线程之间的通信)
CPU:10核 主频100MHz 1核 主频 3GHz 那么哪一个CPU比较好呢? CPU核不是越多越好吗?并不一定.主频用于衡量GPU处理速度的快慢,举个例子10头牛运送货物快还是1架飞机运 ...
- java并发学习--第六章 线程之间的通信
一.等待通知机制wait()与notify() 在线程中除了线程同步机制外,还有一个最重要的机制就是线程之间的协调任务.比如说最常见的生产者与消费者模式,很明显如果要实现这个模式,我们需要创建两个线程 ...
- Thread线程源码解析,Java线程的状态,线程之间的通信
线程的基本概念 什么是线程 现代操作系统在运行一个程序的时候,会为其创建一个进程.例如,启动一个Java程序,操作系统就会创建一个Java进程.线代操作系统调度的最小单位是线程.也叫做轻量级进程.在一 ...
- Java学习笔记46(多线程三:线程之间的通信)
多个线程在处理同一个资源,但是线程的任务却不相同,通过一定的手段使各个线程能有效地利用资源, 这种手段即:等待唤醒机制,又称作线程之间的通信 涉及到的方法:wait(),notify() 示例: 两个 ...
- java线程之间的通信
1.常用的方法 sleep() 该线程进入等待状态,不释放锁 wait() 该线程进入等待状态,释放锁 notify() 随机唤醒一个线程 notifyAll() 唤醒全部线程 getName() 获 ...
- java多线程通过管道流实现不同线程之间的通信
java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
随机推荐
- c# copydata 消息
using PublicCode; using System; using System.Collections.Generic; using System.ComponentModel; using ...
- [BJDCTF2020]EasySearch
0x00 知识点 Apache SSI 远程命令执行漏洞 链接: https://www.cnblogs.com/yuzly/p/11226439.html 当目标服务器开启了SSI与CGI支持,我们 ...
- 【剑指Offer】面试题32 - III. 从上到下打印二叉树 III
题目 请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推. 例如: 给定二叉树: [3,9,20,nu ...
- ffmpeg 多路实时问题之解决思路
记得前面有人提出多路视频不实时问题,这个首先需要从网络带宽上查看是否视频帧全实时的到达,还有一个问题就是,即使视频帧全部到达,看起CPU也是足够的,但是却表现为慢镜头这种样子,那么很可能是解码显示的 ...
- 存储器HK1225-7EQ 使用说明书资料
一. 引脚排列 二. 读取模式 HK1225在WE(写使能)被禁止(high)且CE(片选)被选中(Low)且CE2(片选2)被选中(High)并且OE(读信号)被使能(Low)执行一次读循环.13个 ...
- Linux下部署开源版“禅道”项目管理系统《转载》
Linux下部署开源版“禅道”项目管理系统 https://www.cnblogs.com/xxsl/p/6525378.html
- MacType
#前言 这几天实在是嫌弃Win10垃圾的字体渲染效果--发虚模糊,索性从网上找了个系统字体渲染软件即MacType给系统字体改头换面. #使用效果 这里贴出两个场景的效果对比(单击图片查看具体效果) ...
- opencv.js双边滤波 磨皮处理
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http ...
- PHP数据库基础(简单的)
经常用到的函数 $link=mysql_connect("数据库地址","用户名","密码");//链接数据库mysql_query(“se ...
- CCCC L2-004. 这是二叉搜索树吗?
题意: 一棵二叉搜索树可被递归地定义为具有下列性质的二叉树:对于任一结点, 其左子树中所有结点的键值小于该结点的键值: 其右子树中所有结点的键值大于等于该结点的键值: 其左右子树都是二叉搜索树. 所谓 ...