本篇文章为大家展示了怎么在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中实现多线程通信,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。