1

あるスレッドで標準 i/p ストリームに値を渡し、別のスレッドで表示できるように、2 つのスレッド間で Scanner オブジェクトを共有するにはどうすればよいですか?

以下のように2つのスレッドを作成しました。

Thread1では、以下のコードを使用しました。

while(true)
{

//Thread.currentThread().sleep(5000); // if I used this it is printing ABCD
str = System1Class.scan.nextLine();
System.out.println(str);
}

Thread2では、以下のコードを使用します。

String st = "ABCD";
InputStream is = new ByteArrayInputStream(st.getBytes());
System.setIn(is);
ThreadMainClass.scan  = new Scanner(System.in); // here I am trying to refresh the     global object "scan"

ここで、「スキャン」オブジェクトはクラス ThreadMainClass で次のようにグローバルに作成されます。

public static Scanner scan = new Scanner(System.in);

両方のスレッドでアクセスしています。私の要件は、Thread2 から渡される Thread1 に「ABCD」を表示したいということです。スレッド 1 の行の前に Scanner オブジェクトが作成されるように遅延を設定すると、次のように表示されます。

str = System1Class.scan.nextLine();

しかし、私は2人が遅延を使用したくありません。それで、私にできる方法はありますか?Thread2から渡された瞬間に「ABCD」を表示したい。また、その間、スレッド 1 はコンソールからのデータを待つ必要があります。つまり、スレッド 1 はスレッド 2 からの通知を待つべきではありません。データが Thread2 から渡された場合は、それを取得して印刷するだけです。それ以外の場合は、コンソールからのみ待機する必要があります。

Thread2 から「スキャン」オブジェクトを更新する方法が必要だと思いますが、よくわかりません。:)

前もって感謝します

4

2 に答える 2

0

AtomicBoolean渡された同じインスタンスを表示するには、変数を に設定するクラスのメソッドを呼び出す必要がありますtrue。その変数の真の値をループしてチェックするメソッドを作成する必要があります。の場合はtrue、すぐに印刷します。

またsynchronize、読み取りスレッドと書き込みスレッドを実行していることを確認してください

これは、Java で独自のイベントを作成することによっても実行できます。

このチュートリアルからこの方法についてすべて読んでください。

Java で独自のイベントを作成する方法

于 2012-10-25T12:04:34.607 に答える
0

wait() と notify() メソッドを使用して、2 つのスレッドを同期できます。

グローバルクラスで:

Object wh = new Object();

thread1 のコード:

while(true)
{

//Thread.currentThread().sleep(5000); // if I used this it is printing ABCD
//Wait thread2 to notify
// Prevent IllegalMonitorStateException occurs
synchronized(wh) {
    wh.wait();
}catch (InterruptedException e) {
    e.printStackTrace();
}
str = System1Class.scan.nextLine();
System.out.println(str);
}

thread2 のコード:

String st = "ABCD";
InputStream is = new ByteArrayInputStream(st.getBytes());
System.setIn(is);
ThreadMainClass.scan  = new Scanner(System.in); // here I am trying to refresh the     global object "scan"
//Notify thread1
// Prevent IllegalMonitorStateException occurs
synchronized(wh) {
    wh.notify();
}catch (InterruptedException e) {
    e.printStackTrace();
}

HTH。

于 2012-10-25T12:12:29.790 に答える