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. DOM基础1

    Document Object Model 文档对象模型 1.改内容: innerHTML 例:div1.innerHTML = "我能干<br />什么";      ...

  2. gem5-gpu 全系统FS模式 系统调用SE模式

    SE模式中无线程调度器,只能运行单线程程序,如SPEC CPU 2006,仅模拟片上CPU.GPU.Network和DRAM等. FS模式需加载虚拟Linux和磁盘,Linux负责线程调度.实现了Pt ...

  3. gitlab访问慢,出现502,特别卡,耗内存cpu解决办法

    前言 浏览器访问gitlab的web页面,发现非常慢,并且很容易出现502问题.其中一个原因就是8080端口被tomcat占用,前面一篇已经更换了端口,但还是很慢.后来搜了下,原因是gitlab占用内 ...

  4. PLC与单片机执行指令区别

    单片机执行指令方式与PLC执行指令方式对比 . 映射 对顺序功能图并行分支的理解.   PLC与单片机都是顺序执行指令方式的. PLC执行指令分为3个阶段. PLC的一个指令周期包括 输入采样 程序执 ...

  5. arduino通信问题的学习与解决

    我想实现的是,我用电脑在串口监视器上输入一个字符串,arduino能识别这个字符串中的每一个字符并在相应的串口上给出相应的高低电平以驱动舵机,比如输入L1,RS,功能是左手腕舵机逆时针旋转90°,然后 ...

  6. 在远程服务器上执行本地的shell脚本

    在远程服务器上执行本地的shell脚本 [root@localhost zzx]# sh echoip.sh 192.168.67.131[root@localhost zzx]# ssh root@ ...

  7. java调用存储过程(stored procedures)的HelloWorld例子

    1.java调用存储过程(stored procedures)的HelloWorld程序 有点数据 库基础的人都知道.存储过程(stored procedures)和java没什么关系.它是一段纯粹的 ...

  8. javaweb利用ajax使登录窗口不跳转页面实现对账号密码的判断

    和上一篇判断用户名是否被占用不跳转页面类似!利用ajax实现跳转,要导入jquery文件库!具体代码我会贴出来,注释在里面!!可以观摩一手!(代码我也留下链接,如果失效,评论补发,代码可能导入也无法使 ...

  9. Python LMDB的使用

    在python中使用lmdb linux中,可以使用指令 pip install lmdb 安装lmdb包. ---- lmdb 数据库文件生成 增 改 删 查 1.生成一个空的lmdb数据库文件 # ...

  10. 2016蓝桥杯省赛C/C++A组第六题 寒假作业

    题意:现在小学的数学题目也不是那么好玩的. 看看这个寒假作业: □ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □ 每个方块代表1~13中的某一个数字,但不能重复. 比如: ...