1 回答

TA貢獻1906條經(jīng)驗 獲得超10個贊
有幾個問題:
你應(yīng)該使用
start
on notrun
。如果您正在使用
join
,則將踏面設(shè)置為守護線程是沒有意義的。當(dāng)您
if ... else
在生產(chǎn)商中進行操作時,您只會得到奇數(shù)。它應(yīng)該只是if
和其余的if
(實際上while
是一個更好的做法)。
我認為這樣代碼可以滿足您的需求:
object ThreadsMain extends App {
val syncVar = new SyncVar[Int]()
val isDone = new AtomicBoolean(false)
val producer = new Thread {
override def run(): Unit = {
for (x <- 1 to 15) {
syncVar.synchronized {
while (!syncVar.isEmpty) {
syncVar.wait()
}
syncVar.put(x)
syncVar.notify()
}
}
isDone.set(true)
}
}
producer.start()
val consumer = new Thread {
override def run(): Unit = {
while (!isDone.get()) {
syncVar.synchronized {
while (syncVar.isEmpty) {
syncVar.wait()
}
println(syncVar.get())
syncVar.notify()
}
}
}
}
consumer.start()
producer.join()
consumer.join()
}
class SyncVar[T]() {
var isEmpty: Boolean = true
var value: Option[T] = None
def get(): T = {
if (isEmpty) throw new Exception("Get from empty SyncVar")
else {
val toReturn = value.get
value = None
isEmpty = true
toReturn
}
}
def put(x: T): Unit = {
if (!isEmpty) throw new Exception("Put on non-empty SyncVar")
else {
value = Some(x)
isEmpty = false
}
}
}
添加回答
舉報