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

010*_*011 2 java return class

我正在尝试分配值或在类中返回值.像这样的东西:

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)

有可能吗?谢谢!

Bru*_*eis 5

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

第一个类似于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()方法时可能抛出的异常.要检查的异常,catchExecutionException并调用.getCause()就可以了.我刚添加了缺少的try/catch块.