Java多线程通信实现方式详解
这篇文章主要介绍了Java多线程通信实现方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
线程通信的方式:
1、共享变量
线程间通信可以通过发送信号,发送信号的一个简单方式是在共享对象的变量里设置信号值。线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步代码块里读取hasDataToProcess这个成员变量。这个简单的例子使用了一个持有信号的对象,并提供了set和get方法。
publicclassMySignal1{
//共享的变量
privatebooleanhasDataToProcess=false;
//取值
publicbooleangetHasDataProcess(){
returnhasDataToProcess;
}
//存值
publicvoidsetHasDataToProcess(booleanhasDataToProcess){
this.hasDataToProcess=hasDataToProcess;
}
publicstaticvoidmain(String[]args){
//同一个对象
finalMySignal1my=newMySignal1();
//线程1设置hasDataToProcess值为true
finalThreadt1=newThread(newRunnable(){
@Override
publicvoidrun(){
my.setHasDataToProcess(true);
}
});
t1.start();
//线程2取这个值hasDataToProcess
Threadt2=newThread(newRunnable(){
@Override
publicvoidrun(){
try{
//等待线程1完成后取值
t1.join();
}catch(InterruptedExceptione){
e.printStackTrace();
}
my.getHasDataProcess();
System.out.println("t1改变以后的值:"+my.getHasDataProcess());
}
});
t2.start();
}
}
运行结果如下:
t1改变以后的值:true
2、等待/唤醒(wait/notify)机制
以资源为例,生产者生产一个资源,通知消费者就消费掉一个资源,生产者继续生产资源,消费者消费资源,以此循环,代码如下。
importsun.security.util.Password;
//资源类
classResource{
privateStringname;
privateintcount=1;
privatebooleanflag=false;
publicsynchronizedvoidset(Stringname){
//生产资源
while(flag){
try{
//线程等待
wait();
}catch(InterruptedExceptione){
}
}
this.name=name+"----"+count+"+++++";
System.out.println(Thread.currentThread().getName()+"..生产者..."+this.name);
flag=true;
//唤醒等待中的消费者
this.notifyAll();
}
publicsynchronizedvoidout(){
//消费资源
while(!flag){
try{
//线程等待,生产者生产资源
wait();
}catch(InterruptedExceptione){
}
}
System.out.println(Thread.currentThread().getName()+"...消费者..."+this.name);
flag=false;
//唤醒消费者,生产资源
this.notifyAll();
}
}
//生产者
classProducerimplementsRunnable{
privateResourcers;
publicProducer(Resourcers){
this.rs=rs;
}
//生产者生产资源
@Override
publicvoidrun(){
while(true){
rs.set("商品");
}
}
}
//消费者消费资源
classConsumerimplementsRunnable{
privateResourcers;
publicConsumer(Resourcers){
this.rs=rs;
}
//消费者消费资源
@Override
publicvoidrun(){
while(true){
rs.out();
}
}
}
publicclassProducerConsumerDemo{
publicstaticvoidmain(String[]args){
Resourcer=newResource();
Producerp=newProducer(r);
Consumerc=newConsumer(r);
Threadt1=newThread(p);
Threadt2=newThread(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+++++
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。