Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我怎样才能获得未来<;MyObject>;不使用服务?_Java_Multithreading - Fatal编程技术网

Java 我怎样才能获得未来<;MyObject>;不使用服务?

Java 我怎样才能获得未来<;MyObject>;不使用服务?,java,multithreading,Java,Multithreading,我真的很想这样做: Callable<MyObject> myCallable = .... Future<MyObject> = new Thread( myCallable).start(); FutureTask<MyObject> future = new FutureTask<MyObject>(myCallable); new Thread(future).start(); // FutureTask implements Run

我真的很想这样做:

 Callable<MyObject> myCallable = ....
 Future<MyObject> = new Thread( myCallable).start();
FutureTask<MyObject> future = new FutureTask<MyObject>(myCallable);
new Thread(future).start(); // FutureTask implements Runnable
// Now use the future however you want
Callable myCallable=。。。。
Future=新线程(myCallable).start();
我基本上希望启动一个与主任务并行运行的长时间运行的任务,而不希望使用池或线程重用。执行者的东西似乎非常面向池,它需要我关闭池,所有这些我都不想做

我想使用“Callable/Future”模式,因为我以后可能需要引入执行者,但目前的情况是,它们只是开销


有什么建议吗?

好吧,你可以很容易地编写一个助手方法:

public static Future<T> createFuture(Callable<T> callable)
{
    ExecutorService service = Executors.newSingleThreadExecutor();
    Future<T> ret = service.submit(callable);
    // Let the thread die when the callable has finished
    service.shutdown();
    return ret;
}

是的,我想说这比我的第一个答案要好:)

试试FutureTask。它对Executor框架没有任何明确的依赖性,可以按原样实例化,也可以扩展它来定制它。

可调用/未来的东西是基于线程池的。如果您需要多次执行相同的操作,我强烈建议您使用池

如果您不想使用线程池,那么我建议手动使用线程。通过使用一根线并在上面连接,你想做什么并不难

class X extends Thread {
   MyObject result;

   public void run() {
      // .. do the operation here. Set result
   }

   public MyObject getResult() {
      // This will block until the thread is complete
      join();
      return result;
   }
}
要运行此呼叫,请执行以下操作:

X x = new X();
x.start();
最终,您将调用getResult,它将阻塞直到X的线程完成:

x.getResult();

ExecutorService频繁实例化并多次关闭是否可以?它不是要被重用吗?@AwanBiru:问题是关于一个长期运行的任务,这就是我给出这个答案的原因。我认为创建大量的
ExecutorServices
是可以的,但并不理想,但最好根据实际情况提出一个新问题-尤其是这个问题/答案已经有10年历史了,可能会有新的方法。(我已经有一段时间没有专业地使用Java了。)谢谢你的提醒。按照你的建议,……我会的。