Javaで次のタスクがあります。ユーザーがコンソールにメッセージを書き込んでいます。私はこの入力を読んで、関連するオブジェクト(本)に処理しています。処理された本の数が30に等しい場合、コンソール入力を一時停止し、これまでに処理された本を含むレポートをログに記録してから、コンソールからメッセージを受信し続ける必要があります。(コンソールアプリケーションであるため、シングルスレッドアプリケーションであると想定しています)
私は並行プログラミングの初心者ですが、読んだことから、使用する必要のある方法wait()
とnotify()
方法があります。
これまでの私のアプリケーション構造は次のとおりです。
InputReader.java
-コンソールから入力を読み取り、関連するオブジェクトに変換するメインクラスBookReader.java
-クラス。最も重要なメソッドは、1冊の本を処理することです(これまでに処理された本の数をカウントします)。それを呼びましょうpublic static store(Book book)
。したがってInputReader.java
、単一のコンソール行を読み取った後Book
、それをオブジェクトに処理してBookReader.keep(book)
から呼び出します(calssstore
内のBookReader.java
メソッドは静的であるため)。問題(または私が苦労している部分)は、30冊目の本を読んだ後にコンソールを一時停止してから出力を印刷する方法です。私が読んだことから、私はwait()
自分のstore(Book book)
メソッドnotify()
内とレポートを実行するメソッド内で使用する必要があります。以来store(Book book)
であるstatic
私は、私が使用する必要があることを読んだ方法でprivate static final Object lock = new Object();
、私の内BookStore.java
クラス?したがって、現在の私の構造は次のようなものです。
protected static synchronized void reader(Book book) throws InterruptedException {
counter++;
//some method which will keep my books into a local datastructure
if(counter == 30) {
LOGGER.info("The console should stop accept new input now");
synchronized(lock){
lock.wait();
}
// my main question: do I need to call printReport() here? If not here, then where?
report();
}
}
そしてreport()
それの後にレポートを印刷する方法は、新しいメッセージを読み取るためのコンソールが利用できるようにする必要があります。
private static synchronized void report() {
synchronized(lock){
System.out.printline("print some report here")
}
// I guess after the report is printed, I should use notifyAll() and that will make the console again available for reading an input?
lock.notifyAll();
}
}
私store(Book book)
は静的なのでstatic Object lock = new Object();
、BookReader.java
クラスのオブジェクトとして使用していることを覚えておいてください。私の主な質問:report()
適切な場所でメソッドを呼び出しますか?そこにない場合はどこですか?
次のプログラムは、コンソールから30行を読み取り、レポートを書き込んで、繰り返します。
import java.util.Scanner;
public class ScannerTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (true) {
String report = "";
for (int i = 0; i < 30; i++) {
report += sc.nextLine()+" ";
}
System.out.println(report);
}
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加