2016-02-18 2 views
1

Я прочитал андроид документации (что ясно, как грязь), и он говорит, что:PrintWriter Что делать с ожидающими и уведомляющими методами?

ждать

Причина вызывающего потока ждать, пока другой поток не вызывает метод Notify() или notifyAll() этого объекта.

уведомит

Вызывает поток, который ждет на мониторе этого объекта (с помощью вызова одного из ожидания() методы), чтобы быть разбудили.

Означает ли это, что:

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"); 

Все, что вам нужно для достижения такого же эффекта. Использование wait и notify полезно, когда вы хотите, чтобы один поток ожидал другого, и обычно не используется в одном потоке.

+0

У меня проблема с отправкой нескольких строк в цикле с использованием printwriter через сокет, где он отправляет только первую строку, почему он делает это, так как println блокируется до тех пор, пока он не будет завершен? – razzak

+0

PrintWriter также выполняет буферизацию линий, для повышения эффективности. Он сбрасывает эти буферы либо при закрытии, либо при вызове 'flush' (но вы должны доверять' close', не называйте flush только ради него). –