제작자 - 소비자 모델에서 SynchronousQueue를 사용하는 테스트 예제를 작성했습니다. 그러나 그것은 잘 작동하지 않습니다. 다음은 내 코드는 다음과 같습니다생산자 - 소비자 모델에서 SynchronousQueue를 적절하게 사용하는 방법은 무엇입니까?
public class QueueTest {
String input;
int pos;
BlockingQueue<String> queue;
volatile boolean exitFlag;
QueueTest()
{
for(int i=0; i<10000; i++)
input += "abcde";
input += "X";
pos = 0;
queue = new SynchronousQueue<String>();
exitFlag = false;
}
public static void main(String[] args) {
QueueTest qtest = new QueueTest();
qtest.runTest();
}
void runTest()
{
Thread producer = new Thread(new Producer());
Thread consumer = new Thread(new Consumer());
producer.start();
consumer.start();
try {
producer.join();
consumer.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class Producer implements Runnable
{
public void run()
{
while(true)
{
String s = read();
if(s.equals("X"))
break;
try {
queue.put(s);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
exitFlag = true;
}
}
class Consumer implements Runnable
{
public void run()
{
while(exitFlag == false)
{
String s = null;
try {
s = queue.take();
} catch (InterruptedException e) {
e.printStackTrace();
}
process(s);
}
}
}
String read()
{
String str = input.substring(pos, pos+1);
pos++;
return str;
}
void process(String s)
{
long sum = 0;
for(long i=0; i<1000; i++)
sum = sum * i + i;
}
}
문제는 실행이 교착 상태처럼 붙어있다. 이 간단한 코드에 버그가 있습니까?
는 솔루션을 향해 OP를 도우려고 노력했습니다 ... – jtahlborn
이것은 정말 좋은 생각입니다. 나는 그것을 지금 시도 할 것이다. – JackWM
그것은 작동합니다. 고마워요! 좋은 교훈. – JackWM