是否可以转换许多方法(在接口中定义并在类中实现)作为非阻塞线程运行?
当然,我可以在线程类的 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(); }
}
答案 0 :(得分:5)
根据您上面的问题和评论,您希望调用方法以导致任务的异步执行。执行此操作的最佳方法是通过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”方法指示应采取的操作。
答案 1 :(得分:3)
使它们符合Callable接口并将它们提供给合适的Executor(可在Executors中选择)
答案 2 :(得分:1)
不是从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();
}
}