我正在尝试分配值或在类中返回值.像这样的东西:
void setOff() {
boolean onValue = true;
Thread t = new Thread(new myClass(onValue));
System.out.println("On: " + onValue);
}
class myClass implements Runnable{
public boolean on;
public myClass (boolean _on) {
on = _on
}
public run() {
on = false;
}
}
Run Code Online (Sandbox Code Playgroud)
有可能吗?谢谢!
这是可能的,但您需要稍微更改一下代码.检查以下类:
第一个类似于a Runnable,但是你需要实现的方法被定义为V call() throws Exception,而不是void run():它允许你返回一个值.
第二个包装Callable<V>(或Runnable加一个常量返回值),并且是一个Runnable本身,所以你可以将它传递给Thread就像你在做的那样Runnable.
因此,您可以将代码更改为以下内容:
void setOff() {
final FutureTask<Boolean> ft = new FutureTask<Boolean>(new myClass());
new Thread(ft).start();
try {
System.out.println("The result is: " + ft.get());
} catch (ExecutionException e) {
System.err.println("A method executed on the background thread has thrown an exception");
e.getCause().printStackTrack();
}
}
class myClass implements Callable<Boolean> {
@Override public Boolean call() throws Exception {
// let's fake some long running computation:
Thread.sleep(1000);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
该调用ft.get()仅在call()方法完成执行后返回(在后台线程上),因此您必须等待1秒才能将该行打印到控制台.
还有许多其他有用的方法FutureTask.查看文档.
您可能会发现其他一些有用的类:ExecutorService及其实现和工厂方法Executors.它有一个方法叫做submit接受a Runnable或a Callable<V>,并返回一个Future<?>或者Future<V>,它是一个由它实现的接口FutureTask.你得到了类似的行为.例如:
public static void main() {
final ExecutorService es = Executors.newCachedThreadPool();
final Future<Boolean> f = es.submit(new myClass());
try {
System.out.println("The result is: " + f.get());
} catch (ExecutionException e) {
System.err.println("A method executed on the background thread has thrown an exception");
e.getCause().printStackTrack();
}
es.shutdown();
}
Run Code Online (Sandbox Code Playgroud)
这样做的好处是ExecutorService将为您管理线程.它可能会为你提交的Callables和Runnables创建一些线程并重用它们:如果你有很多这样的工作,这可能会提高性能,因为你将避免每个作业创建一个线程 - 线程创建有一些开销!
编辑:该.get()方法抛出一个ExecutionException,它包装了一个在执行该.call()方法时可能抛出的异常.要检查的异常,catch在ExecutionException并调用.getCause()就可以了.我刚添加了缺少的try/catch块.
| 归档时间: |
|
| 查看次数: |
4750 次 |
| 最近记录: |