2012-02-27 2 views
2

Мне нужно иметь два класса, один класс имеет два метода, каждый из которых займет некоторое время, чтобы выполнить полностью. Второму классу предоставляется информация, которая решит, какой из двух методов в первом классе будет выполняться. Важно, однако, что если второй класс (который будет выполняться в то же время в своем потоке) решает, что должен выполняться другой из двух методов, первый класс должен перейти к выполнению другого метода и не ждать для первого, чтобы закончить.Управление выполнением метода через потоки в Java

Если класс A имеет два метода и класс B параллелен в другом потоке, определяющем, какой метод выполнить, то вот пример: A выполняет метод 1, на выполнение которого потребуется некоторое время. Во время выполнения метода 1, решение класса B должно выполнить метод 2, который означает, что класс A должен немедленно прекратить выполнение метода 1 и перейти к выполнению метода 2.

Возможно ли это? Может быть, с прерываниями?

благодаря

ответ

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. сброс прерванного стата e, что является стандартной идиомой при ловле InterruptedException
4

Если вы сделаете класс А реализовать работоспособным, а затем выполнить его метод, имеющий класс B создать новую тему с объектом типа класса А, вы можете иметь класс B вызвать метод прерывания по классу А нить.

Смежные вопросы