問題:啟動3個執行緒a、b、c,使a列印0,然後b列印1,然後c列印2,a列印3,b列印4,c列印5,依次類推。
思路:每個執行緒給定乙個編號,每個執行緒判斷當前是否已經輪到自己列印:如果沒輪到,就wait等待;如果輪到,則列印當前數字,並喚醒其他執行緒。
判斷是否已經輪到自己列印:
每個執行緒給定乙個編號n,n從0開始;
使用乙個全域性變數記錄當前需要列印的數字c,c從0開始,每次列印之後加1;
執行緒數量m;
判斷邏輯:c%m ==n
舉例說明:3個執行緒m=3,執行緒編號n為0、1、2,
第一次執行,執行緒0判斷為true,執行緒1、執行緒2判斷為false,進入wait,則由執行緒0列印c=0,然後c++,然後喚醒其他執行緒;
執行緒0繼續迴圈發現判斷為false,進入wait;
執行緒1、執行緒2被喚醒,執行緒1判斷為true,執行緒2判斷為false,進入wait,則由執行緒1列印c=1,然後c++,然後喚醒其他執行緒;
執行緒1繼續迴圈發現判斷為false,進入wait;
執行緒0、執行緒2被喚醒,執行緒2判斷為true,執行緒0判斷為false,進入wait,則由執行緒2列印c=2,然後c++,然後喚醒其他執行緒;
依次迴圈,直到c超過給定的最大值,跳出迴圈。
public class printsequencethread implements runnable
@override
public void run()
try catch (interruptedexception e)
}// 最大值跳出迴圈
if (current > max)
system.out.println("thread-" + threadno + " : " + current);
current++;
// 喚醒其他wait執行緒
lock.notifyall();}}
}public static void main(string args) {
int threadcount = 3;
int max = 10;
for(int i=0;i輸出:
thread-0 : 0
thread-1 : 1
thread-2 : 2
thread-0 : 3
thread-1 : 4
thread-2 : 5
thread-0 : 6
thread-1 : 7
thread-2 : 8
thread-0 : 9
thread-1 : 10
使用執行緒順序列印數字
實現思路 要順序列印數字,首先要保證列印處於同步的語句塊中,這個可以用synchronized實現 其次,可以採用執行緒順序來保證數字順序,在for迴圈中開啟執行緒,可以保證執行緒是有序的。package com.xicheng.bigdata author liubin52 date 2018 1...
多執行緒同步 順序列印數字 執行緒條件變數
先把條件變數函式甩出來,等待條件 int pthread cond wait pthread cond t restrict cond,pthread mutex t restric mutex 1 把呼叫執行緒放到所等待條件的執行緒列表上 2 對傳進來已經加過鎖的互斥量解鎖 3 執行緒進入休眠狀態...
多執行緒程式設計 3順序列印
主要功能 printa printl printi 定義三個訊號量依次給三個程序上鎖,並且通過其他程序來給自己解鎖 include include include include semaphore.h using namespace std 三個訊號量相當於三個鎖,可以等價替換 semaphore...