1.生產與消費
2.多視窗售票
3.龜兔賽跑
4.銀行取款
5.讀者寫者
6.多執行緒交替列印abc(順序列印)
具體描述:有A,B,C三個執行緒, A執行緒輸出A, B執行緒輸出B, C執行緒輸出C要求, 同時啟動三個執行緒, 按順序輸出ABC, 迴圈10次
7.描述:子執行緒迴圈10次,接著回到主執行緒迴圈100次,如次迴圈50次。
等等
直接上程式碼,如下(注意註釋)
public class SellTickets {
public static void main(String[] args) {
Ticket ticket=new Ticket(10);
new Thread(ticket,"視窗1").start();
new Thread(ticket,"視窗2").start();
new Thread(ticket,"視窗3").start();
}
}
/**
* 採用實現Runnable介面的方式實現多執行緒
*/
class Ticket implements Runnable {
//總的車票數
int total;
Object object = new Object();
Ticket(int total){
this.total=total;
}
//車票號
int num = 1;
@Override
public void run() {
while (true) {
System.out.println(Thread.currentThread().getName()+" 等待同步鎖");
synchronized (object) {//執行緒持有同一個object物件
// 持有同步鎖的視窗執行同步方法塊等內容
// 而其餘視窗等待該持有該同步鎖的視窗釋放object物件,
// 一旦方法塊執行完,則開始重新分配鎖給哪個視窗持有
System.out.println(Thread.currentThread().getName()+" 持有同步鎖"); try {
if (num > total) {
System.out.println("車票已經賣完啦!");
return;
}
// sleep並不釋放同步鎖,此處只是休眠100s,等休眠100s後執行後續程式碼
Thread.sleep(100);
System.out.println(Thread.currentThread().getName() + " 售出火車票 NO." + (num++));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
複製程式碼
輸出日誌:
視窗1 等待同步鎖
視窗3 等待同步鎖
視窗2 等待同步鎖
視窗1 持有同步鎖
視窗1 售出火車票 NO.1
視窗1 等待同步鎖
視窗2 持有同步鎖
視窗2 售出火車票 NO.2
視窗2 等待同步鎖
視窗2 持有同步鎖
視窗2 售出火車票 NO.3
視窗2 等待同步鎖
視窗3 持有同步鎖
視窗3 售出火車票 NO.4
視窗3 等待同步鎖
視窗2 持有同步鎖
視窗2 售出火車票 NO.5
視窗2 等待同步鎖
視窗1 持有同步鎖
視窗1 售出火車票 NO.6
視窗1 等待同步鎖
視窗2 持有同步鎖
視窗2 售出火車票 NO.7
視窗2 等待同步鎖
視窗3 持有同步鎖
視窗3 售出火車票 NO.8
視窗3 等待同步鎖
視窗3 持有同步鎖
視窗3 售出火車票 NO.9
視窗3 等待同步鎖
視窗2 持有同步鎖
視窗2 售出火車票 NO.10
視窗2 等待同步鎖
視窗2 持有同步鎖
車票已經賣完啦!
視窗1 持有同步鎖
車票已經賣完啦!
視窗3 持有同步鎖
車票已經賣完啦!
複製程式碼
今天的內容就是如此啦,舉例的其他經典案例,就不再此篇幅講了,
大家如果還有其他的經典例子,可以告知哦,謝謝!
本人公眾號,會不定期更新!
感謝您的喜歡
請多多關注和支援!
❤️