ExecutorService Предел потока Java - PullRequest
0 голосов
/ 10 октября 2018

Я использую 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 потоков работали параллельно?

1 Ответ

0 голосов
/ 10 октября 2018

Количество логических процессоров определяет количество потоков, запущенных в данный момент.

Однако процессор может переключать потоки каждые 100 микросекунд или около 10000 раз в секунду, создавая иллюзию, что одновременно выполняется больше потоков.,Вызов sleep может вызвать переключение контекста ЦП до истечения времени ожидания.

ПРИМЕЧАНИЕ. System.out.println удерживает блокировку для вывода, поэтому в действительности только один поток выполняет за разреальная работа, и даже тогда программа, вероятно, замедляется из-за скорости обновления вашего экрана.Попробуйте удалить printlnsleep), и он должен завершиться за долю времени.

Но как все 2000 потоков работали параллельно?

Почти все они спали.Вероятно, единственным занятым потоком был тот, который обновлял экран буферизованными println сообщениями.

...