簡體   English   中英

轉換幾個Java方法作為非阻塞線程運行?

[英]Convert several Java methods to run as non-blocking threads?

是否可以轉換許多方法(在接口中定義並在類中實現)作為非阻塞線程運行?

當然,我可以在線程類的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(); }
}

根據您上面的問題和注釋,您希望調用方法以導致任務的異步執行。 執行此操作的最佳方法是通過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();
        }
    });
  }    
}

可以這樣想,為了異步運行,您需要將某種消息發送到另一個線程以指示它應該工作。 java.util.concurrent包中的Executor框架是形成這些消息的標准化方法。 它們的形成方式是Runnable實例上的“run”方法指示應采取的操作。

使它們符合Callable接口並將它們提供給合適的Executor(在Executors中有很多選擇)

而不是從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();
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM