2016-02-18 100 views
1

我讀Android文檔(這是明顯的泥漿),並說:PrintWriter等待和通知方法做什麼?

等待

導致調用線程等待,直到另一個線程調用通知()或notifyAll的()方法這個對象。

通知

導致其被該對象的監視器上等待的螺紋(通過調用wait()的方法中的一種的手段)被喚醒。

這是否意味着:

public synchronized void myAwesomeFunction (PrintWriter out, String[] data) 
{ 
    for (String d : data) 
    { 
     out.wait(); 
     out.println (d); 
     out.flush(); 
     out.notify(); 
    } 
} 

會等到PrintWriter發送完第一個字符串,然後移動到下一個?還是我完全錯了?

+2

我建議你閱讀https://docs.oracle.com/javase/tutorial/essential/concurrency/guardmeth.html請注意,這不是真的與'PrintWriter'有關 - 這些是在'Object'上定義的方法。 –

回答

2

Java中的每個對象都可以用作鎖。這些方法從Object類繼承而來,對於線程間的同步非常有用。它們與PrintWriter功能完全無關。 println()是一個阻塞函數 - 它在發送第一個字符串(忽略緩衝)之前不會返回。簡單地寫這個:

out.println(d); 
System.out.println("'d' has finished writing"); 

是你需要達到同樣的效果。當你想要一個線程等待另一個線程時,使用waitnotify非常有用,而且在同一個線程中通常不會有用。

+0

我在使用printwriter通過套接字發送多個字符串時發生問題,它只發送第一個字符串,爲什麼它會這樣做,因爲println會阻止它直到完成? – razzak

+0

PrintWriter也會緩存行,以提高效率。當你關閉它,或者當你調用flush時,它會刷新這些緩衝區(但是你應該信任'close',不要爲了它而調用flush)。 –