Java多線程通信實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java多線程通信實(shí)現(xiàn)方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
線程通信的方式:
1、共享變量
線程間通信可以通過(guò)發(fā)送信號(hào),發(fā)送信號(hào)的一個(gè)簡(jiǎn)單方式是在共享對(duì)象的變量里設(shè)置信號(hào)值。線程A在一個(gè)同步塊里設(shè)置boolean型成員變量hasDataToProcess為true,線程B也在同步代碼塊里讀取hasDataToProcess這個(gè)成員變量。這個(gè)簡(jiǎn)單的例子使用了一個(gè)持有信號(hào)的對(duì)象,并提供了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) {
//同一個(gè)對(duì)象
final MySignal1 my = new MySignal1();
//線程1設(shè)置hasDataToProcess值為true
final Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
my.setHasDataToProcess(true);
}
});
t1.start();
//線程2取這個(gè)值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();
}
}
運(yùn)行結(jié)果如下:
t1改變以后的值:true
2、等待/喚醒(wait/notify)機(jī)制
以資源為例,生產(chǎn)者生產(chǎn)一個(gè)資源,通知消費(fèi)者就消費(fèi)掉一個(gè)資源,生產(chǎn)者繼續(xù)生產(chǎn)資源,消費(fèi)者消費(fèi)資源,以此循環(huán),代碼如下。
import sun.security.util.Password;
//資源類
class Resource {
private String name;
private int count = 1;
private boolean flag = false;
public synchronized void set(String name) {
//生產(chǎn)資源
while (flag) {
try {
//線程等待
wait();
} catch (InterruptedException e) {
}
}
this.name = name + "----" + count + "+++++";
System.out.println(Thread.currentThread().getName() + "..生產(chǎn)者..." + this.name);
flag = true;
//喚醒等待中的消費(fèi)者
this.notifyAll();
}
public synchronized void out() {
//消費(fèi)資源
while (!flag) {
try {
//線程等待,生產(chǎn)者生產(chǎn)資源
wait();
} catch (InterruptedException e) {
}
}
System.out.println(Thread.currentThread().getName() + "...消費(fèi)者..." + this.name);
flag = false;
//喚醒消費(fèi)者,生產(chǎn)資源
this.notifyAll();
}
}
//生產(chǎn)者
class Producer implements Runnable {
private Resource rs;
public Producer(Resource rs) {
this.rs = rs;
}
//生產(chǎn)者生產(chǎn)資源
@Override
public void run() {
while (true) {
rs.set("商品");
}
}
}
//消費(fèi)者消費(fèi)資源
class Consumer implements Runnable {
private Resource rs;
public Consumer(Resource rs) {
this.rs = rs;
}
//消費(fèi)者消費(fèi)資源
@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();
}
}
運(yùn)行結(jié)果如下:
Thread-0..生產(chǎn)者...商品----1+++++ Thread-1...消費(fèi)者...商品----1+++++ Thread-0..生產(chǎn)者...商品----1+++++ Thread-1...消費(fèi)者...商品----1+++++ Thread-0..生產(chǎn)者...商品----1+++++ Thread-1...消費(fèi)者...商品----1+++++ Thread-0..生產(chǎn)者...商品----1+++++
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java堆&優(yōu)先級(jí)隊(duì)列示例講解(下)
這篇文章主要通過(guò)示例詳細(xì)為大家介紹Java中的堆以及優(yōu)先級(jí)隊(duì)列,文中的示例代碼講解詳細(xì),對(duì)我們了解java有一定幫助,需要的可以參考一下2022-03-03
IntelliJ IDEA多屏后窗口不顯示問(wèn)題解決方案
這篇文章主要介紹了IntelliJ IDEA多屏后窗口不顯示問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09
Java使用JDBC連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法
這篇文章主要介紹了Java使用JDBC連接數(shù)據(jù)庫(kù)的實(shí)現(xiàn)方法,包括了詳細(xì)的加載步驟以及完整實(shí)現(xiàn)示例,需要的朋友可以參考下2014-09-09
關(guān)于jvm的垃圾回收器以及觸發(fā)full gc的場(chǎng)景
這篇文章主要介紹了關(guān)于jvm的垃圾回收器以及觸發(fā)full gc的場(chǎng)景,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
淺析Java如何在并發(fā)環(huán)境下生成一個(gè)只讀的map
這篇文章主要為大家詳細(xì)介紹了Java如何在并發(fā)環(huán)境下生成一個(gè)只讀的map,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-04-04
Maven setting配置鏡像倉(cāng)庫(kù)的方法步驟
這篇文章主要介紹了Maven setting配置鏡像倉(cāng)庫(kù)的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-12-12

