【问题标题】:ExecutorService Java thread limitExecutorService Java 线程限制
【发布时间】:2019-03-15 19:23:00
【问题描述】:

我正在使用ExecutorService 创建Thread。在run 方法中,它处理一个耗时的操作。完成它需要将近 10 秒。为了测试,这里我使用Thread.sleep(10000);

我的问题是,如果我使用newFixedThreadPool 作为 2000,它真的会一次执行 2000 个线程吗?

public class ThreadPoolTest {

    public static void main(String[] args) {
        System.out.println(new Date());
        ExecutorService executor = Executors.newFixedThreadPool(2000);
        IntStream.range(0, 2000).forEach(
                i -> {
                    Runnable worker = new WorkerThread("WorkerThread-" + i);
                    executor.submit(worker);//calling execute method of ExecutorService
                }
        );
        executor.shutdown();
        while (!executor.isTerminated()) {   }

        System.out.println("Finished all threads");
        System.out.println("Main thread finished");
        System.out.println(new Date());


    }
}


public class WorkerThread implements Runnable{

    private String name;
    public WorkerThread(String s){
        this.name=s;
    }

    public void run() {
        System.out.println(Thread.currentThread().getName()+" (Start) message = "+name);
        processData();

    }

    private void processData(){
        try {  Thread.sleep(10000);  } catch (InterruptedException e) { e.printStackTrace(); }
    }

}

我正在这段代码中打印时间。它表明,完成整个过程只需要10秒。这意味着所有 2000 个线程并行执行?听说实际运行的线程数会根据系统中cores的数量而定。但是所有 2000 个线程是如何并行运行的呢?

【问题讨论】:

    标签: java multithreading executorservice threadpoolexecutor java-threads


    【解决方案1】:

    逻辑 CPU 的数量决定了在给定时刻运行的线程数。

    但是,CPU 可以每 100 微秒或大约每秒 10,000 次切换线程,从而产生同时运行更多线程的错觉。调用sleep 可能会导致CPU 进行上下文切换,直到超时。

    注意:System.out.println 为输出持有一个锁,所以实际上,一次只有一个线程在做真正的工作,即使这样,程序也可能会因为屏幕更新的速度而变慢。尝试删除println(和sleep),它应该会在很短的时间内完成。

    但是所有 2000 个线程是如何并行运行的呢?

    几乎所有人都睡着了。唯一繁忙的线程可能是使用缓冲的println 消息更新屏幕的线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 2011-06-16
      • 2014-08-01
      • 2020-09-24
      • 1970-01-01
      • 2011-08-17
      • 2012-08-08
      相关资源
      最近更新 更多