Java學習筆記之執行緒 五 執行緒的通訊

2021-08-08 11:18:07 字數 2919 閱讀 8918

package com.demo;

/* * 執行緒通訊:乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務;

* * 生產者與消費者:生產者生產出產品之後要通知消費者來消費產品;消費者消費完產品之後要通知生產者繼續生產產品;

*

* 下面模擬生產者與消費者的程式,輸出結果時,出現了執行緒安全問題,**錯亂。

* 分析:當生產者搶到cpu的執行權的時候,生產者開始生產產品;假設生產者當前生產的是香蕉,**是2.0,然後生產者

* 繼續生產蘋果,當執行到p.name="蘋果";的時候,只修改了產品的名稱,還沒來得及修改產品的**,cpu的執行權

* 就被消費者搶走了,那麼此時消費者輸出的就是蘋果的**是2.0。

* * 解決辦法:同步**塊;

*/// 產品類

class product

// 生產者類

class producer extends thread

@override

public void run() catch (interruptedexception e)

p.price = 6.5;

}else

i++;

// 生產者每生產乙個產品後輸出一句話

system.out.println("生產者生產了" + p.name + ", **" + p.price);

} }}// 消費者類

* 同步**塊解決執行緒安全問題:

*/// 產品類

class product

// 生產者類

class producer extends thread

@override

public void run() catch (interruptedexception e)

p.price = 6.5;

}else

i++;

// 生產者每生產乙個產品後輸出一句話

system.out.println("生產者生產了" + p.name + ", **" + p.price);

}} }

}// 消費者類

/* * 雖然解決了執行緒安全問題,但是還有乙個問題:生產者每次都會生產多個產品,或者消費者每次都會消費多個產品。

* 我們需要的現象是:生產者生產完乙個產品以後,緊接著消費者就來消費這個產品;當消費者消費完產品以後,

* 生產者才繼續生產產品;要想達到這樣的功能,就需要執行緒通訊來完成。

* * 執行緒通訊兩個重要的方法:

* wait():執行緒等待;如果執行緒執行了wait()方法,那麼該執行緒就會進入等待的狀態;等待狀態下的執行緒

* 必須被其他執行緒呼叫notify()方法才能喚醒;

* notify():喚醒執行緒池中處於等待狀態的乙個執行緒;

* notifyall():喚醒執行緒池中處於等待狀態的所有執行緒;

* * wait()方法與notify()方法注意事項:

* 1、這兩個方法必須要由鎖物件呼叫;

* 因為乙個執行緒如果呼叫了wait()方法,那麼該執行緒就會進入乙個以鎖物件為識別符號的執行緒池中等待;

* 而乙個執行緒如果呼叫了notify()方法,那麼就會喚醒以鎖物件為識別符號的執行緒池中的乙個等待執行緒;

* 如果這兩個方法不由鎖物件呼叫,那麼就不會建立以鎖物件為識別符號的執行緒池,也就沒法喚醒指定的執行緒;

* 2、這兩個方法不是屬於thread類的,而是屬於object的;

* 因為鎖物件可以是任意物件,如果這兩個方法設計在thread物件上,那麼鎖物件就不可以是任意物件了;

* 3、這兩個方法必須要在同步**塊或者同步函式中才能使用;

* 因為只有在同步**塊或者同步函式中才會有鎖物件的存在,而這兩個方法只能由鎖物件呼叫;

*/// 產品類

class product

// 生產者類

class producer extends thread

@override

public void run() else

i++;

// 生產者每生產乙個產品後輸出一句話

system.out.println("生產者生產了" + p.name + ", **" + p.price);

// 產品被生產出來以後,要修改產品標記

p.flag = true;

// 生產者生產出產品以後要喚醒消費者進行消費

p.notify();

}else catch (interruptedexception e) }}

} }}// 消費者類

class customer extends thread

@override

public void run() else catch (interruptedexception e) }}

} }}public class demo7

}

Java多執行緒學習筆記(五)執行緒池

一 執行緒池的基本類 executors 執行緒池工廠,通過 executors 可以取得乙個擁有特定功能的執行緒池。threadpoolexecutor 執行緒池,實現了executor 介面,因此通過這個介面,任何 runnable物件都可以被 threadpoolexecutor執行緒池排程。...

linux多執行緒學習筆記五 執行緒安全

一,執行緒安全基礎 乙個函式被稱為執行緒安全的當且僅當被多個併發執行緒反覆呼叫時,它會一直產生正確的結果。我們能夠定義出四類執行緒不安全函式。第一類 不保護共享變數的函式 共享變數在多執行緒中是共享資料,可以通過同步機制來保護共享資料。第二類 保護跨越多個呼叫狀態的函式 乙個偽隨機數生成器是乙個簡單...

kinect學習筆記五(執行緒併發)

因為想同時處理左右手,想採用執行緒併發來同時處理,提高處理速度,找了些材料,貼到這裡以供以後使用 include include using namespace std dword winapi processrighthand lpvoid param 右手處理執行緒 dword winapi p...