首页 文章

java ExecutorService newSingleThreadExecutor只使用一个Thread执行所有任务吗?

提问于
浏览
-3

我知道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());
        }
    }
}

上面的代码总是打印相同的ThreadID .

如果我更换下面的线

Executors.newSingleThreadExecutor();

ExecutorService ex = Executors.newFixedThreadPool(2);

然后它再次能够使用2个线程执行所有任务 .

只有我用的时候

Executors.newCachedThreadPool();

我看到不同的线程ID .

ExecutorService如何重用Thread?是不是让它到达死亡状态?

1 回答

  • 1

    ThreadPoolExecutor 维护了一些 Worker 个线程,其工作方式如下:

    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();
        }
    
    }
    

    当您向具有单个 Worker 线程的 ThreadPoolExecutor 提交任务时,调用线程将在以下条件下将任务置于 BlockingQueue 中:

    • Worker 正忙

    • BlockingQueue 未满

    Worker 空闲时,它将从 BlockingQueue 中检索新任务 .

相关问题