Had*_*adi 2 java multithreading executorservice
这是我的代码:
public static void main(String[] args) {
System.out.println("program started");
ExecutorService executor = Executors.newCachedThreadPool();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("thread finished");
}
});
executor.execute(thread);
try {
thread.join();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("thread joined");
}
Run Code Online (Sandbox Code Playgroud)
当我如上所示启动我的线程时,thread.join()它不起作用,它不会等待线程完成.我需要通过ExecutorService执行我的Thread,并等待该Thread完成.但是我的代码效果不好.谁能帮我?
为什么我不使用Future而不是Thread?
因为有时我需要中断我的线程并等待线程完成.但是当我取消一个Future时,future.get()得到一个Exception并且不等待它的Thread完成.
如果我的句子的语法不正确,我会提前道歉.因为我不会说英语.
Gho*_*ica 14
简单回答:不要这样做.
不要混合像这样的抽象层.Executor接口不是execute()线程.它需要Runnables.将Thread对象传递给它并不重要,除了调用run()方法之外,根本不会使用你的线程.
混合"低层"裸铁线程与抽象的Executor服务简直是一个坏主意.
该线程池概念的重点在于您不会尝试控制底层线程.等待池化线程结束毫无意义.线程池保持线程,因为建立线程是一个(相对)昂贵的操作.所以他们不会结束,而是活下来,将来做其他工作.
这里真正的答案是:要么不使用那个执行器服务,要么寻找一个适用于该概念的解决方案(没有你进入并做一些低级别的东西).
而"真实的"答案是:退后一步,并告诉我们您打算以这种方式解决的"真实"问题.
你的错误是微妙的.
注意Executor.execute()的API :它需要一个Runnable.和Thread实现Runnable,所以它可以传递给Executor.但是,返回的实现Executors.newCachedThreadPool()仅使用您传递run()的Thread实例的方法.在Thread本身从来没有开始,执行人使用它在它的线程池内部管理线程.
解决方案很简单:Executors.newCachedThreadPool()重新调整ExecutorService,使用其submit(Runnable)方法.你会得到Future<?>一个返回值.呼唤get()未来将产生同样的效果Thread.join()
有关如何使用ExecutorServices 的更广泛说明,请查看此处:http://tutorials.jenkov.com/java-util-concurrent/executorservice.html.
| 归档时间: |
|
| 查看次数: |
269 次 |
| 最近记录: |