Javaで他のメソッドが終了している間にコンソールintpuを一時停止するにはどうすればよいですか?

sammy333

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()適切な場所でメソッドを呼び出しますか?そこにない場合はどこですか?

Jan Larsen

次のプログラムは、コンソールから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]

編集
0

コメントを追加

0

関連記事

分類Dev

メインスレッドでメソッドを呼び出して、他のスレッドを終了するにはどうすればよいですか?

分類Dev

以下のコードで応答時間を計算してコンソールに出力するにはどうすればよいですか?

分類Dev

ループが終了するのを待たずに同じメソッドを同時に実行するにはどうすればよいですか?

分類Dev

アクションボタンは複数のメソッドを呼び出しますが、それらの間に短い一時停止を挿入するにはどうすればよいですか?

分類Dev

アクションボタンは複数のメソッドを呼び出しますが、それらの間に短い一時停止を挿入するにはどうすればよいですか?

分類Dev

setTimeoutメソッドを使用して、指定した時間後にカルーセルを移動するにはどうすればよいですか?Javascript

分類Dev

Java-メソッドの呼び出しを停止するにはどうすればよいですか?

分類Dev

JavaScriptメソッドを他のバックボーンメソッドで使用できるようにするにはどうすればよいですか?

分類Dev

Eclipseでのデバッグ中にスレッドを一時停止する代わりに、Javaオブジェクトの現在の値をコンソールに出力するにはどうすればよいですか?

分類Dev

tkinterを使用してソケットスレッドの一部であるwhileループを停止するにはどうすればよいですか?

分類Dev

非同期メソッドの結果が得られるまでプログラムを一時停止するにはどうすればよいですか?

分類Dev

C ++コンパイル時に複数のメソッドが呼び出されないようにするにはどうすればよいですか?

分類Dev

配列をループするメソッドを停止するにはどうすればよいですか?

分類Dev

実行時にすべてのコンソールメッセージをCordovaiOSにログオンさせるにはどうすればよいですか?

分類Dev

メソッドを特定の位置に必要な時間保持するにはどうすればよいですか?

分類Dev

NodeJのメソッドに時間制限を設定するにはどうすればよいですか?

分類Dev

デバッグモードが停止した後にVisualStudio 2015 Javascriptコンソールを表示するにはどうすればよいですか?

分類Dev

Javaで外部メソッドの実行を停止するにはどうすればよいですか?

分類Dev

forEachメソッドとコールバックを唯一の引数として使用して、配列内のすべての名前をコンソールログに記録するにはどうすればよいですか?

分類Dev

DispatcherTimerが終了するまでforループを一時停止するにはどうすればよいですか?

分類Dev

メソッドを必要とする1つのコンポーネントと、それを必要としない他のコンポーネントによって使用されるように、共通のコンポーネントでメソッドを使用するにはどうすればよいですか?

分類Dev

キー入力からトグルメソッドを使用して、Javaでスレッドゲームを一時停止するにはどうすればよいですか?

分類Dev

他のすべてのスレッドが停止するまでmain()を一時停止するにはどうすればよいですか?

分類Dev

ReSharperを使用して、ソリューション内の未使用のメソッドを一覧表示するにはどうすればよいですか?

分類Dev

Vueコンポーネントのメソッドでメソッドを正しく使用するにはどうすればよいですか?

分類Dev

ウェブページのリクエストを処理しているときに、どのメソッドが時間を費やしているのかを特定するにはどうすればよいですか?

分類Dev

Javaのsleep()メソッドがロックを保持しているかどうかを確認するにはどうすればよいですか?

分類Dev

Xamarin.FormsのRg.Plugins.Popupから応答を取得するまでメソッドを一時停止するにはどうすればよいですか?

分類Dev

リフレクションなどを使用してメソッドのコードを動的に抽出するにはどうすればよいですか?

Related 関連記事

  1. 1

    メインスレッドでメソッドを呼び出して、他のスレッドを終了するにはどうすればよいですか?

  2. 2

    以下のコードで応答時間を計算してコンソールに出力するにはどうすればよいですか?

  3. 3

    ループが終了するのを待たずに同じメソッドを同時に実行するにはどうすればよいですか?

  4. 4

    アクションボタンは複数のメソッドを呼び出しますが、それらの間に短い一時停止を挿入するにはどうすればよいですか?

  5. 5

    アクションボタンは複数のメソッドを呼び出しますが、それらの間に短い一時停止を挿入するにはどうすればよいですか?

  6. 6

    setTimeoutメソッドを使用して、指定した時間後にカルーセルを移動するにはどうすればよいですか?Javascript

  7. 7

    Java-メソッドの呼び出しを停止するにはどうすればよいですか?

  8. 8

    JavaScriptメソッドを他のバックボーンメソッドで使用できるようにするにはどうすればよいですか?

  9. 9

    Eclipseでのデバッグ中にスレッドを一時停止する代わりに、Javaオブジェクトの現在の値をコンソールに出力するにはどうすればよいですか?

  10. 10

    tkinterを使用してソケットスレッドの一部であるwhileループを停止するにはどうすればよいですか?

  11. 11

    非同期メソッドの結果が得られるまでプログラムを一時停止するにはどうすればよいですか?

  12. 12

    C ++コンパイル時に複数のメソッドが呼び出されないようにするにはどうすればよいですか?

  13. 13

    配列をループするメソッドを停止するにはどうすればよいですか?

  14. 14

    実行時にすべてのコンソールメッセージをCordovaiOSにログオンさせるにはどうすればよいですか?

  15. 15

    メソッドを特定の位置に必要な時間保持するにはどうすればよいですか?

  16. 16

    NodeJのメソッドに時間制限を設定するにはどうすればよいですか?

  17. 17

    デバッグモードが停止した後にVisualStudio 2015 Javascriptコンソールを表示するにはどうすればよいですか?

  18. 18

    Javaで外部メソッドの実行を停止するにはどうすればよいですか?

  19. 19

    forEachメソッドとコールバックを唯一の引数として使用して、配列内のすべての名前をコンソールログに記録するにはどうすればよいですか?

  20. 20

    DispatcherTimerが終了するまでforループを一時停止するにはどうすればよいですか?

  21. 21

    メソッドを必要とする1つのコンポーネントと、それを必要としない他のコンポーネントによって使用されるように、共通のコンポーネントでメソッドを使用するにはどうすればよいですか?

  22. 22

    キー入力からトグルメソッドを使用して、Javaでスレッドゲームを一時停止するにはどうすればよいですか?

  23. 23

    他のすべてのスレッドが停止するまでmain()を一時停止するにはどうすればよいですか?

  24. 24

    ReSharperを使用して、ソリューション内の未使用のメソッドを一覧表示するにはどうすればよいですか?

  25. 25

    Vueコンポーネントのメソッドでメソッドを正しく使用するにはどうすればよいですか?

  26. 26

    ウェブページのリクエストを処理しているときに、どのメソッドが時間を費やしているのかを特定するにはどうすればよいですか?

  27. 27

    Javaのsleep()メソッドがロックを保持しているかどうかを確認するにはどうすればよいですか?

  28. 28

    Xamarin.FormsのRg.Plugins.Popupから応答を取得するまでメソッドを一時停止するにはどうすればよいですか?

  29. 29

    リフレクションなどを使用してメソッドのコードを動的に抽出するにはどうすればよいですか?

ホットタグ

アーカイブ