Преобразовать несколько методов Java для запуска в качестве неблокирующих потоков? - PullRequest
2 голосов
/ 14 сентября 2010

Можно ли преобразовать несколько методов (определенных в интерфейсе и реализованных в классе) для работы в качестве неблокирующих потоков?

Конечно, я могу обернуть каждый отдельный метод в метод run () класса потока.Но, возможно, существует более изощренный способ деформировать несколько разных методов за один шаг, то есть с помощью обертки класса одного потока?

Согласно приведенному ниже примеру 'Adamski' я не хочу создаватьRunnable класс для каждого метода интерфейса, т.е. я хотел бы избежать следующего:

public interface MyBusinessClass 
{
    void a();
    void b();
}


public class MyRunnable_a  implements Runnable 
{
    private final MyBusinessClass bizClass;
    public MyRunnable_a(MyBusinessClass bizClass) { this.bizClass = bizClass; }

    public void run() { bizClass.a(); }
}


public class MyRunnable_b  implements Runnable 
{
    private final MyBusinessClass bizClass;
    public MyRunnable_b(MyBusinessClass bizClass) { this.bizClass = bizClass; }

    public void run() { bizClass.b(); }
}

Ответы [ 3 ]

5 голосов
/ 15 сентября 2010

Исходя из вашего вопроса и комментария выше, вы бы хотели, чтобы вызов метода приводил к асинхронному выполнению задачи.Лучший способ сделать это через экземпляры Runnable и ExecutorService.

public class MyBusinessClass {
  ExecutorService myExecutor = Executors.newCachedThreadPool(); //or whatever

  void a(){
    myExecutor.execute(new Runnable() {
        public void run() {
          doA();
        }
    });
  }    

  void b(){
    myExecutor.execute(new Runnable() {
        public void run() {
          doB();
        }
    });
  }    
}

Подумайте об этом, чтобы асинхронно работать, вам нужно отправить какое-то сообщение другому потоку, чтобы указатьдолжен делать работу.Платформа Executor в пакете java.util.concurrent является стандартизированным способом формирования этих сообщений.Они сформированы таким образом, что метод run в экземпляре Runnable указывает, какие действия следует предпринять.

3 голосов
/ 14 сентября 2010

Сделайте так, чтобы они соответствовали интерфейсу Callable, и предоставьте их подходящему исполнителю (множество из Исполнители )

1 голос
/ 14 сентября 2010

Вместо того, чтобы наследовать от java.lang.Thread и переопределить метод run(), было бы лучше создать реализацию java.lang.Runnable, которая вызывала бы методы в нужном порядке. Реализация Runnable может иметь ссылку на ваш класс, предоставляющий эти методы, или может быть частью самого класса.

/**
 * Business class that defines the methods to be run in a dedicated thread.
 * Classes implementing this interface are responsible for thread safety.
 */
public interface MyBusinessClass {
  void a();

  void b();

  void c();
}

/**
 * Runnable implementation that calls the methods defined on MyBusinessClass.
 */
public class MyRunnable implements Runnable {
  private final MyBusinessClass bizClass;

  public MyRunnable(MyBusinessClass bizClass) {
    this.bizClass = bizClass;
  }

  public void run() {
    bizClass.a();
    bizClass.b();
    bizClass.c();
  }
}
...