下面给大家带来的实例是和java多线程通信有关的内容,那么你知道java多线程之间的通信应该如何实现吗?一起来看看代码实例吧!
一、共享变量
线程间通信能够通过发送信号,发送信号的一个比较简单方式,就是在共享对象的变量里设置信号值。
线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步块里读取hasDataToProcess这个成员变量。
这里使用了一个持有信号的对象,并且,还提供了set和get方法。
package igeekhome.com; public class MySignal { //共享的变量 private boolean hasDataToProcess = false; //取值 public boolean getHasDataToProcess() { return hasDataToProcess; } //存值 public void setHasDataToProcess(boolean hasDataToProcess) { this.hasDataToProcess = hasDataToProcess; } public static void main(String[] args) { //同一个对象 final MySignal my = new MySignal(); //线程 1 设置 hasDataToProcess 值为 true final Thread t1 = new Thread(new Runnable() { public void run() { my.setHasDataToProcess(true); } }); t1.start(); //线程 2 取这个值 hasDataToProcess Thread t2 = new Thread(new Runnable() { public void run() { try { //等待线程 1 完成然后取值 t1.join(); } catch (InterruptedException e) { e.printStackTrace(); } my.getHasDataToProcess(); System.out.println("t1 改变以后的值:" + my.isHasDataToProcess()); 34. } }); t2.start(); } } 结果: t1 改变以后的值: true
二、wait/notify机制
以资源作为例子。
生产者生产除一个资源,通知消费者就消费掉一个资源,生产者继续生产资源,消费者消费资源,一直这样循环下去。
package igeekhome.com; //资源类 class Resource { private String name; private int count = 1; private boolean flag = false; public synchronized void set(String name) { //生产资源 while (flag) { try { //线程等待。消费者消费资源 wait(); } catch (Exception 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 (Exception e) {} } 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; } //生产者生产资源 public void run() { while (true) { res.set("商品"); } } } //消费者消费资源 class Consumer implements Runnable { private Resource res; Consumer(Resource res) { this.res = res; } public void run() { while (true) { res.out(); } } } public class ProducerConsumerDemo { public static void main(String[] args) { Resource r = new Resource(); Producer pro = new Producer(r); Consumer con = new Consumer(r); Thread t1 = new Thread(pro); Thread t2 = new Thread(con); t1.start(); t2.start(); } }
java线程之间如何通信你都知道了吧?更多java入门内容,可以继续关注本站来了解哦。
推荐阅读: