0

別のスレッドから値をポーリングするにはどうすればよいですか。例: ThreadA に、別の Thread(ThreadB) のメソッドを呼び出すメソッドがあります。5 秒ごとにそのメソッドの戻り値の型 (文字列) の値を確認し、その値 (成功/失敗など) に基づいて ThreadB を強制終了できるように、いくつかのポーリング メカニズムを使用する必要があります。どうすればできますか..助けてください。

これはオブザーバー パターンで実行できますが、現在は小さな変更です。スレッド B の値を 5 秒ごとにポーリングしています。ただし、ThreadB の値は 10 分後にのみ変更されます。ここで私の質問は、5 秒ごとに、毎回呼び出さずに ThreadB の値を取得する方法です。ThreadB は 1 回だけ呼び出すことができます。

4

2 に答える 2

1

次に例を示します。

public class Blofeld extends Thread {

    private volatile boolean isBombDefused;
    private volatile int count = 10;

    public void run() {
        System.out.println("Blofeld starts countdown");
        while (!isBombDefused) {
            System.out.println(count + " seconds and counting...");
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            count--;
            if (count <= 0) {
                System.out.println("This is the price of failure...");
                throw new RuntimeException("BOOOOM!");
            }
        }
        System.out.println("Mr. Bond! Mr. Bond! We can do a deal!");
    }

    public int getCount() {
        return count;
    }

    public void cutRedWire() {
        System.out.println("SNIP!");
        isBombDefused = true;
    }
}

public class Bond {    
    public static void main(String[] args) throws InterruptedException {
        Blofeld blofeld = new Blofeld();
        blofeld.start();
        while (blofeld.getCount() > 007) {
            Thread.sleep(1000);
            System.out.println("Bond works frantically");
        }
        blofeld.cutRedWire();
    }
}

編集: artbristol からのコメントの後、マスター値が常に読み取られるように両方のフィールドを揮発性にしました。

于 2012-04-19T07:26:32.803 に答える
0

低レベルのスレッドで作業したい場合を除いて、次のことができます。

  • スレッドbのメソッド(mB)をランナブルに埋め込み、それをanに送信し、送信によって返されたfExecutorServiceを格納します。Future
  • InterruptedExceptionmBでキャッチし、キャッチされたら終了します
  • スレッドaのメソッドをランナブルに埋め込み、ScheduledExecutorService5秒ごとに実行されるに送信します
  • 条件が真の場合は、f.cancel(true)またはshutdownNow最初のエグゼキュータに電話してください

追伸:それは、本当に5秒ごとにポーリングしたい場合です。よりリアルタイムのものを好む場合は、Andreasのコメントの方が理にかなっています。

于 2012-04-19T06:47:21.193 に答える