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)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
随机推荐
- 《机学五》KNN算法及实例
一.概述 [定义]如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 二.距离计算公式 两个样本的距离可以通过如下公式计算,又叫[欧式距 ...
- 吴裕雄--天生自然java开发常用类库学习笔记:SortedSet接口
import java.util.SortedSet ; import java.util.TreeSet ; public class TreeSetDemo05{ public static vo ...
- PyPI提供双因素身份验证(2FA),已提高下载安全性
前天,Python的核心开发团队宣布PyPI现在提供双因素身份验证(2FA),以提高Python包下载的安全性,从而降低未经授权的帐户访问的风险.该团队宣布将在Python Package Index ...
- mybatis update set 多个字段
<update id="updateCustomer" parameterType="com.entrym.domain.Customer"> UP ...
- Photoshop 更换证件照底色
1.打开photoshop CS6. 2.打开照片 (上栏)文件---->打开 或者,直接把照片拖进ps中. 3.复制图层 右击背景,点击复制图层 (复制图层的作用是,如果对图层操作错误,可以 ...
- 3.3. Mapping methods with several source parameters(具有多个源参数的映射方法)
3.3. Mapping methods with several source parameters(具有多个源参数的映射方法) MapStruct 还支持具有多个源参数的映射方法.这是比较实用的, ...
- centos7下使用yum安装ifconfig工具
步骤1:搜索安装包 步骤2:使用yum安装 至此,ifconfig工具安装完毕,希望对你有帮助~
- jQuery判断输入法和非输入法输入
需求背景: 页面需要输入完成后自动查询. 解决方案: $('input').on('input', function() { if ($(this).prop('comStart')) return; ...
- (22)Canny算法
基础知识,主要是看这个博客:https://blog.csdn.net/qq_41167777/article/details/84863351
- C# Process类详解
C# Process类详解 Process[] processes = Process.GetProcessesByName(current.ProcessName); 根据进程名字找到所有进程,返回 ...