tasks
이라고하는 LinkedBlockingQueue
이 있는데, tasks.take()
을 호출하고 작업을 사용할 수있을 때까지 기다릴 때 CPU 사용량은 100 %입니다. tasks.take()
메서드를 사용하는 스레드가 여러 개 있습니다 (모든 스레드마다 자체 tasks
변수가 있음). 왜 이런 일이 일어나는 지 아는 사람이 있습니까? tasks
변수큰 CPU 영향 LinkedBlockingQueue
private LinkedBlockingQueue<ComputerTask> tasks;
// snip
this.tasks = new LinkedBlockingQueue<ComputerTask>(100);
코드의
Defenition는 새 작업
this.tasks.offer(task);
에게 제공
ComputerTask task = tasks.take();
코드 작업을하는
P.S. 이 Java 버전에 문제가 있는지 알지 못합니다. 다른 컴퓨터에서 아직 테스트하지 않았기 때문입니다.
java version "1.6.0_31"
Java(TM) SE Runtime Environment (build 1.6.0_31-b04-413-11M3623)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01-413, mixed mode)
아마도 작업을 수행하는 것이 없으며 대기열이 비어 있습니다. 그렇습니까? 그렇다면 분명히 루핑하는 소비자 스레드 일 것입니다. –
예. 대기열이 비어 있습니다. 0.2 초마다 채워지지 않습니다. 몇 분 후에 다시 채워질 수 있습니다. 그때는 문제 죠? 그러나 그것은 프로그램의 중요한 부분이므로, 나는 그것을 정말로 꺼낼 수는 없습니다. 어떤 추천? – Robbietjuh
@Robbietjuh 증가 된 CPU의 위치를 평가하는 것이 좋습니다. 예를 들어, 생산자가 전혀없는 상태에서 10 개의 스레드를 테이크 할 수 있습니다. 그래도 여전히 CPU가 증가했다면 다른 곳에서는 문제가 발생합니다 (다른 기능이없는 간단한 앱을 작성한다는 것을 증명하기 위해). 표준 JDK를 사용하고 단순히 LBQ를 'take'하는 경우에는 CPU 사용이 없습니다. –