四個執行緒交替列印字串

2021-10-10 05:23:55 字數 4385 閱讀 2458

**於leetcode1195

編寫乙個可以從 1 到 n 輸出代表這個數字的字串的程式,但是:

如果這個數字可以被 3 整除,輸出 「fizz」。

如果這個數字可以被 5 整除,輸出 「buzz」。

如果這個數字可以同時被 3 和 5 整除,輸出 「fizzbuzz」。

例如,當 n = 15,輸出: 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14, fizzbuzz。

假設有這麼乙個類:

class fizzbuzz // constructor

public void fizz(printfizz) // only output 「fizz」

public void buzz(printbuzz) // only output 「buzz」

public void fizzbuzz(printfizzbuzz) // only output 「fizzbuzz」

public void number(printnumber) // only output the numbers

}請你實現乙個有四個執行緒的多執行緒版 fizzbuzz, 同乙個 fizzbuzz 例項會被如下四個執行緒使用:

執行緒a將呼叫 fizz() 來判斷是否能被 3 整除,如果可以,則輸出 fizz。

執行緒b將呼叫 buzz() 來判斷是否能被 5 整除,如果可以,則輸出 buzz。

執行緒c將呼叫 fizzbuzz() 來判斷是否同時能被 3 和 5 整除,如果可以,則輸出 fizzbuzz。

執行緒d將呼叫 number() 來實現輸出既不能被 3 整除也不能被 5 整除的數字。

while迴圈等待滿足條件時輸出

class

fizzbuzz

// printfizz.run() outputs "fizz".

public

void

fizz

(runnable printfizz)

throws interruptedexception }}

}}// printbuzz.run() outputs "buzz".

public

void

buzz

(runnable printbuzz)

throws interruptedexception }}

}}// printfizzbuzz.run() outputs "fizzbuzz".

public

void

fizzbuzz

(runnable printfizzbuzz)

throws interruptedexception }}

}}// printnumber.accept(x) outputs "x", where x is an integer.

public

void

number

(intconsumer printnumber)

throws interruptedexception }}

}}}

直接用原子類就能解決共享變數的問題。

class

fizzbuzz

// printfizz.run() outputs "fizz".

public

void

fizz

(runnable printfizz)

throws interruptedexception }}

// printbuzz.run() outputs "buzz".

public

void

buzz

(runnable printbuzz)

throws interruptedexception }}

// printfizzbuzz.run() outputs "fizzbuzz".

public

void

fizzbuzz

(runnable printfizzbuzz)

throws interruptedexception }}

// printnumber.accept(x) outputs "x", where x is an integer.

public

void

number

(intconsumer printnumber)

throws interruptedexception }}

}

直接用wait-notify實現同步。如果不滿足自己當前的條件就wait,否則notify其他人。這裡我有乙個困惑的地方,notify不會釋放鎖,那應該一直在while裡面迴圈才對,但是下面**是可以提交成功的。

class

fizzbuzz

// printfizz.run() outputs "fizz".

public

synchronized

void

fizz

(runnable printfizz)

throws interruptedexception

printfizz.

run();

curnum++

;notifyall()

;}}// printbuzz.run() outputs "buzz".

public

synchronized

void

buzz

(runnable printbuzz)

throws interruptedexception

printbuzz.

run();

curnum++

;notifyall()

;}}// printfizzbuzz.run() outputs "fizzbuzz".

public

synchronized

void

fizzbuzz

(runnable printfizzbuzz)

throws interruptedexception

printfizzbuzz.

run();

curnum++

;notifyall()

;}}// printnumber.accept(x) outputs "x", where x is an integer.

public

synchronized

void

number

(intconsumer printnumber)

throws interruptedexception

printnumber.

accept

(curnum)

; curnum++

;notifyall()

;}}}

用了四個訊號量,這我可真想不到。

class

fizzbuzz

public

void

releasesemaphorebynum

(int i)

elseif(

(i+1)%

3==0)

elseif(

(i+1)%

5==0)

else

}// printfizz.run() outputs "fizz".

public

void

fizz

(runnable printfizz)

throws interruptedexception }}

// printbuzz.run() outputs "buzz".

public

void

buzz

(runnable printbuzz)

throws interruptedexception }}

// printfizzbuzz.run() outputs "fizzbuzz".

public

void

fizzbuzz

(runnable printfizzbuzz)

throws interruptedexception }}

// printnumber.accept(x) outputs "x", where x is an integer.

public

void

number

(intconsumer printnumber)

throws interruptedexception }}

}

python3 交替列印字串 leetcode

交替列印之類的問題,一般通過乙個主線程判斷其他執行緒的進入條件,通過訊號量實現即可。此題中,通過num主線程,來判斷其他執行緒的進入條件。每個執行緒執行時,其他執行緒是被阻塞的。import threading class fizzbuzz def init self,n int self.n n ...

每日一題 多執行緒程式設計 1195 交替列印字串

採用訊號量semaphore進行執行緒控制,但是除錯了半天總是不通過,一直提示超時,看了下通過的答案和我的設計是一樣的,於是複製貼上了一下發現竟然通過了。仔細看了一下,發現竟然是try finally塊沒寫就造成通不過了。finally塊保證了執行緒一定會釋放訊號量。class fizzbuzz p...

DbgPrint列印字串

1 直接列印字串。dbgprint hello world 2 空結尾的字串,你可以用普通得c 語法表示字串常量 char variable string hello world dbgprint s variable string 3 空結尾的寬字串 wchar 型別 wchar string w...