Java - 将方法传递给 class 并在新线程中执行
Java - Pass a method to a class and execute it in a new Thread
[检查问题底部是否有更新]
如标题所示,我想写一个 class 接受一个方法并在新线程中执行它。我潜伏在周围,想出了类似的东西:
import java.util.concurrent.Callable;
public class MyExecutor<T> implements Runnable{
private Callable<T> method;
public <T> MyExecutor(Callable<T> pMethod){
this.method = pMethod;
}
@Override
public void run() {
try {
// start a new Thread, then
method.call();
} catch (Exception e) {
System.err.println("Failed calling method "+method.getClass());
e.printStackTrace();
}
}
}
但是 Eclipse 警告我,在构造函数中,在
this.method = pMethod;
我cannot convert from Callable <T> to Callable <T>
.
感觉我做的事情完全错了,但我无法理解。
更新
原来我是在重新发明轮子,我想做的可以这样实现:
public class MyExecutor implements Executor{
@Override
public void execute(Runnable command) {
new Thread(command).start();
}
}
在主流程中,一个方法可以像这样在一个新线程中执行:
MyExecutor myExec = new MyExecutor();
myExec.execute(new Runnable() {
@Override
public void run() {
myMethod();
}
});
由于您向构造函数添加了类型参数 <T>
,因此它隐藏了 class 的类型参数。因此,构造函数参数 pMethod
的 T
与 class 参数不同 T
,这是 Eclipse 警告您的内容。只需将构造函数的签名更改为 public MyExecutor(...)
.
[检查问题底部是否有更新]
如标题所示,我想写一个 class 接受一个方法并在新线程中执行它。我潜伏在周围,想出了类似的东西:
import java.util.concurrent.Callable;
public class MyExecutor<T> implements Runnable{
private Callable<T> method;
public <T> MyExecutor(Callable<T> pMethod){
this.method = pMethod;
}
@Override
public void run() {
try {
// start a new Thread, then
method.call();
} catch (Exception e) {
System.err.println("Failed calling method "+method.getClass());
e.printStackTrace();
}
}
}
但是 Eclipse 警告我,在构造函数中,在
this.method = pMethod;
我cannot convert from Callable <T> to Callable <T>
.
感觉我做的事情完全错了,但我无法理解。
更新
原来我是在重新发明轮子,我想做的可以这样实现:
public class MyExecutor implements Executor{
@Override
public void execute(Runnable command) {
new Thread(command).start();
}
}
在主流程中,一个方法可以像这样在一个新线程中执行:
MyExecutor myExec = new MyExecutor();
myExec.execute(new Runnable() {
@Override
public void run() {
myMethod();
}
});
由于您向构造函数添加了类型参数 <T>
,因此它隐藏了 class 的类型参数。因此,构造函数参数 pMethod
的 T
与 class 参数不同 T
,这是 Eclipse 警告您的内容。只需将构造函数的签名更改为 public MyExecutor(...)
.