我对以下内容感到困惑:
要在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. 
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top