3個執行緒順序列印數字

2021-08-20 09:59:32 字數 1342 閱讀 1248

問題:啟動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...