我正在尝试分配值或在类中返回值。像这样:
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;
}
}
这样的事情可能吗?谢谢!
答案 0 :(得分:5)
这是可能的,但您需要稍微更改一下代码。检查以下类:
Callable<V>
强> FutureTask<V>
强> 第一个类似于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;
}
}
调用ft.get()
只会在call()
方法完成执行后(在后台线程上)返回,因此您必须等待1秒才能将该行打印到控制台。
FutureTask
还有许多其他有用的方法。检查the documentation。
您可能会发现其他一些有用的课程: ExecutorService
及其实施,以及 Executors
中的工厂方法。它有一个名为submit
的方法,它接受Runnable
或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();
}
实现的接口之一{1}}。你得到了类似的行为。例如:
.get()
这样做的好处是ExecutorService
将为您管理线程。它可能会为你提交的Callables和Runnables创建一些线程并重用它们:如果你有很多这样的工作,这可能会提高性能,因为你将避免每个作业创建一个线程 - 线程创建有一些开销!
编辑:ExecutionException
方法抛出.call()
,它包含了在执行catch
方法期间可能抛出的异常。要检查例外,请ExecutionException
.getCause()
并在其上调用{{1}}。我刚刚添加了缺少的try / catch块。