programing

자바 스레드 재사용

goodcopy 2021. 1. 15. 19:17
반응형

자바 스레드 재사용


나는 항상 스레드를 만드는 것이 비싸다는 것을 읽었습니다.
또한 스레드를 다시 실행할 수 없다는 것도 알고 있습니다.

나는 Executors수업 문서에서 본다 .

필요에 따라 새 스레드를 생성하는 스레드 풀을 생성하지만 이전에 생성 된 스레드가 사용 가능할 때 재사용합니다.

'재사용'이라는 단어에 유의하십시오.

스레드 풀이 스레드를 '재사용'하는 방법은 무엇입니까?


나는 당신을 혼란스럽게하는 것이 무엇인지 이해했다고 생각합니다. 그래서 여기에 제 더 긴 대답이 있습니다. 용어는 약간 오해의 소지가 있습니다 (분명히 '재사용'을 강조하는 질문을하지 않을 것입니다).

스레드 풀이 스레드를 '재사용'하는 방법은 무엇입니까?

일어나는 일은 여러 작업을 처리하는 데 단일 스레드를 사용할 수 있다는 것입니다 (일반적으로로 전달 Runnable되지만 이는 '실행자'프레임 워크에 따라 다릅니다. 기본 실행기는을 허용 Runnable하지만 자신의 "실행자"/ 스레드 풀을 작성할 수 있습니다. Runnable[like, say, a CancellableRunnable]) 보다 더 복잡 합니다.

이제 기본 ExecutorService구현에서 스레드가 여전히 사용 중에 종료되면 자동으로 새 스레드로 대체되지만 이것이 말하는 '재사용'은 아닙니다. 이 경우 "재사용"이 없습니다.

당신이 호출 할 수 있다는 사실이다 그래서 start()두 번 자바 쓰레드상에서 하지만 당신이 많은으로 전달할 수 있습니다 Runnable당신은 실행기 각에 원하는만큼 Runnablerun()일단 호출 할 것이다 방법.

30 Runnable~ 5 개의 Java를 전달할 수 있으며 Thread각 작업자 스레드는 예를 들어 run()6 번 호출 할 수 있습니다 (실제로 정확히 6 Runnable실행된다는 보장 Thread없지만 세부 사항입니다).

이 예에서는 start()6 번 호출되었을 것입니다. 이 6 start()각각 메소드를 정확히 한 번 호출 합니다 .run()Thread

에서 Thread.start()자바 독 :

 * Causes this thread to begin execution; the Java Virtual Machine 
 * calls the <code>run</code> method of this thread.

그러나 각 스레드의 run()메소드 내부에서 Runnable대기열에서 제외되고 run()각각 메소드 Runnable가 호출됩니다. 따라서 각 스레드는 여러 Runnable. 이것이 "스레드 재사용"에서 언급하는 것입니다.

자신의 스레드 풀을 수행하는 한 가지 방법은 실행 가능 항목을 대기열에 넣고 각 스레드를 사용하는 차단 대기열을 사용하는 run()것입니다. a 메소드 처리가 완료 Runnable되면 다음 Runnable(또는 블록) 대기열에서 빼고 해당 run()메소드를 실행 한 다음 헹구십시오. 반복합니다.

혼동의 일부는 a Threadtake a Runnablestart()Runnable의 run()메서드를 호출 할 때 기본 스레드 풀 가져가는 동안 호출 된다는 사실에서 비롯된 것 같습니다 Runnable.


run스레드 풀의 스레드 방법은 단 하나의 작업을 실행 구성되지 않습니다. run스레드 풀에서 스레드의 방법은 루프가 포함되어 있습니다. 대기열에서 작업을 가져 와서 작업을 실행 한 후 ( 완료되면 루프다시 돌아옴) 다음 작업을 가져옵니다. run메서드는 스레드가 더 이상 필요하지 않을 때까지 완료되지 않습니다.

추가하기 위해 편집 :

다음은 ThreadPoolExecutorrunWorker내부 클래스 메서드입니다 .

696:         /**
697:          * Main run loop
698:          */
699:         public void run() {
700:             try {
701:                 Runnable task = firstTask;
702:                 firstTask = null;
703:                 while (task != null || (task = getTask()) != null) {
704:                     runTask(task);
705:                     task = null; // unnecessary but can help GC
706:                 }
707:             } finally {
708:                 workerDone(this);
709:             }
710:         }

스레드 풀은 내부 작업 대기열에서 작업을 가져올 수있는 여러 고정 작업자 스레드로 구성됩니다. 하나의 작업이 종료 그래서 만약 스레드는 않습니다 하지 끝이 아니라 다음 작업을 기다립니다. 스레드를 중단하면 자동으로 대체됩니다.

자세한 내용 설명서 를 참조하십시오.


스레드 풀은 자체 스레드를 생성하고 해당 스레드에 대한 고유 한 작은 Runnable을 제공합니다. 이러한 Runnable은 절대 끝나지 않고 해당 대기열에 Callable이있을 때까지 대기열에서 동기화합니다 (기다림 ()). 이러한 상황이 발생하면 알림을 받고 Runnable이 대기열에서 Callable을 실행하고 전체 시나리오가 다시 반복됩니다.

참조 URL : https://stackoverflow.com/questions/2324030/java-thread-reuse

반응형