먼저 각 소비자에 대해 만들고 소비자가 작업을 마친 후에는 소비자가 실행 기능을 끝내고 죽을 것이므로 무한 루프가 필요 없습니다. 그러나 각 소비자에 대한 스레드를 만드는 것은 좋은 생각이 아닙니다. 스레드 생성은 성능 관점에서 상당히 비싸기 때문입니다. 스레드는 매우 고가의 자원입니다. 또한, 나는 runnable을 구현하고 스레드를 확장하지 않는 것이 더 낫다는 위의 대답에 동의한다.스레드를 사용자 정의하려는 경우에만 스레드를 확장하십시오. 스레드 풀을 사용하고 소비자가 스레드 풀에서 스레드가 실행 한 실행 가능 개체가 될 것을 강력히 제안합니다. 코드는 다음과 같아야합니다.
public class ConsumerMgr{
int poolSize = 2;
int maxPoolSize = 2;
long keepAliveTime = 10;
ThreadPoolExecutor threadPool = null;
final ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(
5);
public ConsumerMgr()
{
threadPool = new ThreadPoolExecutor(poolSize, maxPoolSize,
keepAliveTime, TimeUnit.SECONDS, queue);
}
public void runTask(Runnable task)
{
// System.out.println("Task count.."+threadPool.getTaskCount());
// System.out.println("Queue Size before assigning the
// task.."+queue.size());
threadPool.execute(task);
// System.out.println("Queue Size after assigning the
// task.."+queue.size());
// System.out.println("Pool Size after assigning the
// task.."+threadPool.getActiveCount());
// System.out.println("Task count.."+threadPool.getTaskCount());
System.out.println("Task count.." + queue.size());
}
잘 모르겠습니다. 이 스레드는 실제로 영원히 실행됩니다. 영원한 달리기를 사용할지 말지는 완전히 당신에게 달려 있습니다. – alf