Java - 如何在类中“返回”一个值

时间:2013-04-06 02:42:41

标签: java class return

我正在尝试分配值或在类中返回值。像这样:

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;

    }

}

这样的事情可能吗?谢谢!

1 个答案:

答案 0 :(得分:5)

这是可能的,但您需要稍微更改一下代码。检查以下类:

第一个类似于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的方法,它接受RunnableCallable<V>,并返回Future<?>Future<V>,这是FutureTaskpublic 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块。