通过Java中的Threads控制方法的执行

时间:2012-02-27 22:20:12

标签: java multithreading

我需要有两个类,一个类有两个方法,每个方法都需要一段时间才能完全执行。第二个类被赋予信息,该信息将决定第一类中的两个方法中的哪一个将执行。但重要的是,如果第二个类(将在其自己的线程中同时执行)决定两个方法中的另一个应该执行,则第一个类将直接执行另一个方法而不必等待第一个完成。

如果A类有两个方法,并且B类在另一个线程中并行决定执行哪个方法,那么这里是一个例子: A正在执行方法1,需要一段时间才能返回。在方法1的执行过程中,B类决定方法2应该执行,这意味着A类应该立即停止执行方法1并继续执行方法2.

这可能吗?也许有中断?

感谢

2 个答案:

答案 0 :(得分:4)

如果你让A类工具运行,然后通过让B类创建一个带有类A类对象的新线程来执行它的方法,你可以让B类在A类线程上调用中断方法。

答案 1 :(得分:2)

以下是应该有效的概要:

class ClassA implements Runnable {

    public volatile boolean switchToOther;

    @Override
    public void run() {
        switchToOther = false;
        try {
            method1();
        } catch (InterruptedException e) {
            // Restore the interrupted status
            Thread.currentThread().interrupt();
        }
        if (switchToOther) {
            method2();
        }
    }

    public void method1() throws InterruptedException {
        work();
    }

    public void method2() throws InterruptedException {
        otherWork();
    }
}

class ClassB implements Runnable {

    @Override
    public void run() {
        ClassA a = new ClassA();
        Thread t = new Thread(a);
        t.start();
        if (decideToSwitch()) {
            a.switchToOther = true;
            t.interrupt();
        }
    }
}

注意:

  1. InterruptedException可能超出您的控制范围,所以您应该检查它是否由于显式切换,
  2. 多个线程使用的volatile字段上的switchToOther
  3. 重置中断状态,这是捕捉InterruptedException
  4. 时的标准习惯用法