Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 ExecutorService newSingleThreadExecutor是否仅使用一个线程执行所有任务?_Java_Multithreading - Fatal编程技术网

java ExecutorService newSingleThreadExecutor是否仅使用一个线程执行所有任务?

java ExecutorService newSingleThreadExecutor是否仅使用一个线程执行所有任务?,java,multithreading,Java,Multithreading,我知道java线程不能重新启动。所以,当我向newSingleThreadExecutor提交多个任务时,它如何使用单个线程执行所有任务 我的理解是newSingleThreadExecutor每次最多使用一个线程来处理任何提交的任务。我猜newFixedThreadPool也是这样。 如果一个线程无法重新启动,那么为了执行n个任务,应该生成n个线程。我认为newSingleThreadExecutor、newFixedThreadPool将确保不会同时生成许多线程,就像我们不使用Executo

我知道java线程不能重新启动。所以,当我向newSingleThreadExecutor提交多个任务时,它如何使用单个线程执行所有任务

我的理解是newSingleThreadExecutor每次最多使用一个线程来处理任何提交的任务。我猜newFixedThreadPool也是这样。 如果一个线程无法重新启动,那么为了执行n个任务,应该生成n个线程。我认为newSingleThreadExecutor、newFixedThreadPool将确保不会同时生成许多线程,就像我们不使用ExecutorService时所做的那样(我们将每个任务附加一个线程并单独启动)

下面是一个代码示例

class Task implements Runnable {
    public void run() {
        System.out.println("ThreadID-" + Thread.currentThread().getId());
        try {
            Thread.sleep(100);
        }
        catch (InterruptedException e) {
        }
    }
}

public class SingleThreadExecutorTest {
    public static void main(String[] args) {
        System.out.println("ThreadID-" + Thread.currentThread().getId());
        ExecutorService ex = Executors.newSingleThreadExecutor();
        for (int i = 0; i < 10; i++) {
            ex.execute(new Task());
        }
    }
}

然后,它同样能够使用2个线程执行所有任务

只有当我使用

Executors.newCachedThreadPool();
我看到不同的线程ID

ExecutorService如何重用线程?
它不会让它达到死状态吗?

线程池执行器维护一些
工作线程,其工作方式如下:

public class Demo {

    public class Worker implements Runnable {
        @Override
        public void run() {
            Runnable task = getTaskFromQueue();
            while (task != null) {
                task.run();
                task = getTaskFromQueue();  // This might get blocked if the queue is empty, so the worker thread will not terminate
            }
        }
    }

    public static void main(String[] args) {
        Worker worker = new Worker();
        Thread thread = new Thread(worker);
        thread.start();
    }

}
当您将任务提交到具有单个
工作线程的
ThreadPoolExecutor
时,调用线程将在以下条件下将任务放入
阻塞队列

  • 单个
    工作者
    正忙
  • 阻塞队列
    未满

工作者
空闲时,它将从此
阻塞队列
检索新任务线程池执行器
维护一些
工作者
线程,其工作方式如下:

public class Demo {

    public class Worker implements Runnable {
        @Override
        public void run() {
            Runnable task = getTaskFromQueue();
            while (task != null) {
                task.run();
                task = getTaskFromQueue();  // This might get blocked if the queue is empty, so the worker thread will not terminate
            }
        }
    }

    public static void main(String[] args) {
        Worker worker = new Worker();
        Thread thread = new Thread(worker);
        thread.start();
    }

}
当您将任务提交到具有单个
工作线程的
ThreadPoolExecutor
时,调用线程将在以下条件下将任务放入
阻塞队列

  • 单个
    工作者
    正忙
  • 阻塞队列
    未满

工作者
空闲时,它将从此
阻塞队列
中检索新任务执行器将任务发送到池中,无限循环中的线程检查池中是否有要执行的新任务。因此,newSingleThreadExecutor将有一个线程,其中run方法将运行无限循环。提交的可运行对象将进入队列。无限循环将检查队列,轮询可运行对象并调用其run方法。所以这里Runnable只是用来定义任务。我的缺点是,我认为它将使用Thread(Runnable)构造函数创建一个Thread对象。executor将任务发送到池,无限循环中的线程检查池中是否有要执行的新任务。newSingleThreadExecutor将有一个线程,其中run方法将运行无限循环。提交的可运行对象将进入队列。无限循环将检查队列,轮询可运行对象并调用其run方法。所以这里Runnable只是用来定义任务。我的缺点是,我认为它将使用Thread(Runnable)构造函数创建Thread对象。
public class Demo {

    public class Worker implements Runnable {
        @Override
        public void run() {
            Runnable task = getTaskFromQueue();
            while (task != null) {
                task.run();
                task = getTaskFromQueue();  // This might get blocked if the queue is empty, so the worker thread will not terminate
            }
        }
    }

    public static void main(String[] args) {
        Worker worker = new Worker();
        Thread thread = new Thread(worker);
        thread.start();
    }

}