这篇文章主要介绍了Java多线程通信实现方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
线程通信的方式:
1、共享变量
线程间通信可以通过发送信号,发送信号的一个简单方式是在共享对象的变量里设置信号值。线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步代码块里读取hasDataToProcess这个成员变量。这个简单的例子使用了一个持有信号的对象,并提供了set和get方法。
public class MySignal1 { //共享的变量 private boolean hasDataToProcess = false; //取值 public boolean getHasDataProcess() { return hasDataToProcess; } //存值 public void setHasDataToProcess(boolean hasDataToProcess) { this.hasDataToProcess = hasDataToProcess; } public static void main(String[] args) { //同一个对象 final MySignal1 my = new MySignal1(); //线程1设置hasDataToProcess值为true final Thread t1 = new Thread(new Runnable() { @Override public void run() { my.setHasDataToProcess(true); } }); t1.start(); //线程2取这个值hasDataToProcess Thread t2 = new Thread(new Runnable() { @Override public void run() { try { //等待线程1完成后取值 t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } my.getHasDataProcess(); System.out.println("t1改变以后的值:"+my.getHasDataProcess()); } }); t2.start(); } }
运行结果如下:
t1改变以后的值:true
2、等待/唤醒(wait/notify)机制
以资源为例,生产者生产一个资源,通知消费者就消费掉一个资源,生产者继续生产资源,消费者消费资源,以此循环,代码如下。
import sun.security.util.Password; //资源类 class Resource { private String name; private int count = 1; private boolean flag = false; public synchronized void set(String name) { //生产资源 while (flag) { try { //线程等待 wait(); } catch (InterruptedException e) { } } 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) { } } System.out.println(Thread.currentThread().getName() + "...消费者..." + this.name); flag = false; //唤醒消费者,生产资源 this.notifyAll(); } } //生产者 class Producer implements Runnable { private Resource rs; public Producer(Resource rs) { this.rs = rs; } //生产者生产资源 @Override public void run() { while (true) { rs.set("商品"); } } } //消费者消费资源 class Consumer implements Runnable { private Resource rs; public Consumer(Resource rs) { this.rs = rs; } //消费者消费资源 @Override public void run() { while (true) { rs.out(); } } } public class ProducerConsumerDemo { public static void main(String[] args) { Resource r = new Resource(); Producer p = new Producer(r); Consumer c = new Consumer(r); Thread t1 = new Thread(p); Thread t2 = new Thread(c); t1.start(); t2.start(); } }
运行结果如下:
Thread-0..生产者...商品----1+++++ Thread-1...消费者...商品----1+++++ Thread-0..生产者...商品----1+++++ Thread-1...消费者...商品----1+++++ Thread-0..生产者...商品----1+++++ Thread-1...消费者...商品----1+++++ Thread-0..生产者...商品----1+++++
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍Java多线程中线程间的通信实例详解,包括了Java多线程中线程间的通信实例详解的使用技巧和注意事项,需要的朋友参考一下 Java多线程中线程间的通信 一、使用while方式来实现线程之间的通信 程序输出: 理解:线程Thread2不停地通过while语句检测这个条件(list.size()==5)是否成立 ,从而实现了线程间的通信。但是这种方式会浪费CPU资源。 二、wait no
本文向大家介绍Java多线程实现四种方式原理详解,包括了Java多线程实现四种方式原理详解的使用技巧和注意事项,需要的朋友参考一下 1.继承Thread类,重写run方法 2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target 3.通过Callable和FutureTask创建线程 4.通过线程池创建线程 前面两种可以归结为一
本文向大家介绍Java多线程实现Runnable方式,包括了Java多线程实现Runnable方式的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了Java多线程实现Runnable方式的具体方法,供大家参考,具体内容如下 (一)步骤 1.定义实现Runnable接口 2.覆盖Runnable接口中的run方法,将线程要运行的代码存放在run方法中。 3.通过Thread类建立线程对象
本文向大家介绍Java线程通信详解,包括了Java线程通信详解的使用技巧和注意事项,需要的朋友参考一下 线程通信用来保证线程协调运行,一般在做线程同步的时候才需要考虑线程通信的问题。 1、传统的线程通信 通常利用Objeclt类提供的三个方法: wait() 导致当前线程等待,并释放该同步监视器的锁定,直到其它线程调用该同步监视器的notify()或者notifyAll()方法唤醒线程。 noti
本文向大家介绍详细解读JAVA多线程实现的三种方式,包括了详细解读JAVA多线程实现的三种方式的使用技巧和注意事项,需要的朋友参考一下 最近在做代码优化时学习和研究了下JAVA多线程的使用,看了菜鸟们的见解后做了下总结。 1、继承Thread类实现多线程 继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且
本文向大家介绍java 多线程-线程通信实例讲解,包括了java 多线程-线程通信实例讲解的使用技巧和注意事项,需要的朋友参考一下 线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线程等待相同信号 不要对常量字符串或全局对象调用 wait() 通过共