**於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...