私はExecutorServiceを使用して2つの独立したスレッドを作成しました。今私はちょうど1つのスレッドがファイルにデータを書き込んで、別のスレッドがファイルにデータを書き込んでいるスレッドからの通知を受け取った後にそれを読むことを望みますが、出力には何も表示されません。2つの独立したスレッドで待機して通知する方法はありますか?
My code is:
package threadingexamples;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class ThreadingExamples {
public static void main(String[] args) throws InterruptedException {
ExecutorService es = Executors.newFixedThreadPool(2);
es.submit(new ForLoo1());
es.submit(new ForLoop2());
es.shutdown();
es.awaitTermination(1, TimeUnit.DAYS);
System.exit(0);
}
}
class ForLoo1 implements Callable<Object> {
@Override
public Object call() throws Exception {
System.out.println("I am writing content into file....");
String s = "This is the content to write into a file";
File file = new File("/home/f.txt");
if (!file.exists()) {
file.createNewFile();
}
FileWriter fw = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(fw);
bw.write(s);
bw.close();
System.out.println("Now you can read content from files...");
notify();
return null;
}
}
class ForLoop2 implements Callable<Object> {
@Override
public Object call() throws Exception {
wait();
System.out.println("Okay i am now going to read content of files...");
BufferedReader br = new BufferedReader(new FileReader("f.txt"));
String str;
while ((str = br.readLine()) != null) {
str = str + "";
}
System.out.println("I am done with reading.....");
System.out.println(str);
return null;
}
}
スレッド1はForLoop1インスタンスでnotify()を呼び出し、スレッド2はForLoop2インスタンスでwait()を呼び出します。それはうまくいかない。さらに、あなたは待機中にwhileループを使用していません。低レベルの待機と通知を使用しないでください。 CountDownLatchのように、より高いレベルで使いやすい抽象化を使用します。 –
スレッド間に同期がありません。待機するものがあることを確認するまで、「待機」を呼び出すことはできません。 'call'が完了すると、既に起こったことを待っています。これは永遠に待っていることを意味します。 –
[Semaphore](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Semaphore.html)または[CountDownLatch](https://docs.oracle.com)をご覧ください。 –