0

我如何从另一个线程轮询价值。例如:我在 ThreadA 中有一个方法,它调用另一个 Thread(ThreadB) 的方法。我需要使用一些轮询机制,以便每 5 秒我应该能够检查该方法的返回类型(字符串)的值,并且基于该值(比如成功/失败)我应该能够杀死 ThreadB。怎么做..请帮忙。

这可以通过观察者模式来完成,但现在变化很小——我每 5 秒轮询一次 threadB 的值。但 ThreadB 的值仅在 10 分钟后才会改变。在这里,我的问题是每 5 秒我如何获得 ThreadB 的值,而无需每次都调用它。ThreadB 只能调用一次。

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();
    }
}

编辑:在 artbrisol 发表评论后,这两个字段都变得易变,以便始终读取主值。

于 2012-04-19T07:26:32.803 回答
0

除非您想使用低级线程,否则您可以:

  • 将线程 b 的方法 (mB) 嵌入到可运行对象中并将其提交给 anExecutorService并存储Future提交返回的 f
  • 抓住InterruptedExceptionmB 并在被抓住时退出
  • 将线程 a 的方法嵌入到可运行对象中并将其提交给ScheduledExecutorService每 5 秒运行一次的
  • 如果您的条件为真,请致电f.cancel(true)shutdownNow第一执行人

Ps:那是如果你真的想每 5 秒轮询一次,如果你更喜欢更实时的东西,Andreas 的评论更有意义。

于 2012-04-19T06:47:21.193 回答