首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ExecutorService Java线程限制

ExecutorService Java线程限制
EN

Stack Overflow用户
提问于 2018-10-11 03:45:32
回答 1查看 310关注 0票数 1

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

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

代码语言:javascript
复制
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个线程是如何并行运行的呢?

EN

回答 1

Stack Overflow用户

发布于 2018-10-11 03:52:57

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

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

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

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

他们几乎都睡着了。唯一忙碌的线程可能是使用缓冲的println消息更新屏幕的线程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52747720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档