Java线程通过执行人重新使用
-
04-10-2019 - |
题
我对以下内容感到困惑:
要在Java程序中使用线程,最简单的方法是扩展线程类并实现可运行的接口(或简单地实现可运行的)。
开始线程的执行。我们必须调用线程的方法start(),然后又调用线程的方法运行方法()。因此线开始。
方法开始()(除非我错了) 必须精确地调用一次 对于每个线程。结果,除非以某种方式运行方法本身在无限的循环中运行,否则无法重复使用线程实例,从而促进了线程重新使用的自定义实现。
现在是Javadoc链接文字说
执行的呼叫如果可用
我不明白这是如何实现的。我以执行方法的执行方法提供我的自定义线程
ExecutorService myCachedPool = Executors.newCachedThreadPool();
myCachedPool.execute(new Runnable(){public void run(){
//do something time consuming
}});
我如何重复使用此自定义线程给执行程序框架?
如果我们不能在程序中,允许执行人允许执行者拨打超过1次?我误会了什么吗?
谢谢你。
解决方案
请注意,不是 Executor
打电话 start()
- 它的 ExecutorService
. 。不,它没有打电话 start()
两次。它不会启动您直接使用的任务 Thread.start()
...相反,它启动了一个线程,该线程知道该线程池的工作队列。该线程基本上会等到有一些工作要做,然后捡起并执行它,然后再返回等待。因此,尽管线程执行多个任务,但 Thread.start()
仅被称为一次。
编辑:从评论来看,您对 Runnable
(这是要执行的任务)和 Thread
(这是执行任务的原因)。
同一线程可以执行多个任务。对于一个非常简单的示例,不使用线程池,请考虑以下方式:
public class MultiRunnable implements Runnable
{
private final List<Runnable> runnables;
public MultiRunnable(List<Runnable> runnables)
{
this.runnables = runnables;
}
public void run()
{
for (Runnable runnable : runnables)
{
runnable.run();
}
}
}
(忽略使用A的潜在线程安全问题 List<T>
来自多个线程。)
您可以创建一大堆 Runnable
能够做不同事情的任务,然后创建一个 MultiRunnable
依次运行它们。通过那个实例 MultiRunnable
进入 Thread
构造函数,然后当您启动线程时,它将执行每个原始运行任务。这有帮助吗?
其他提示
它不会多次调用start();取而代之的是,池中的线程永远不会完成,而只是活着 - 等待。如果您想查看源代码,则可以下载。
线程池中的每个线程都可以简单地 wait()
使执行人将其交给新运行,但线程自己的 run()
方法尚未完成。它只是等待将新运行的人提供给执行者。
要多次“启动”线程,请创建一个可运行的线程。例如:
//NO
private class T extends Thread { //not necessary to implement runnable
public void run(){
//...
}
}
void someMethod(){
T a = new T();
a.start();
a.start(); //NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO NO
}
反而,
//Yes
private class T implements Runnable {
public void run(){
//...
}
}
void someMethod(){
T a = new T();
new Thread(a).start();
new Thread(a).start(); //YES YES YES
}
也可以这样做:
void someMethod(){
final Runnable r = new Runnable(){
public void run(){
//...
}
};
new Thread(r).start();
new Thread(r).start();
}
// r could also be a field of you class.