큐의 요소를 2 개의 스레드로 처리하고 OutputQueue를 입력과 동일한 순서로 준비하려고했습니다. 나는 여전히 동기화 된 블록을 만들어야하지만 다음과 같은 질문에 얽매여있다.스레드가 파괴되면 변수가 파괴됩니까?
- 빈 OutputQueue은 내가이 올바른 방법으로하고 있는가 반환됩니다.
ThreadMailClass.java
public class ThreadMainClass {
public static void main(String[] args) {
int[] inputQueue={2,3,4,5,6};
processJobs(inputQueue);
}
public static void processJobs(int[] inputQueue){
Queue<Integer> queue = new LinkedList<Integer>();
for(int i:inputQueue){
queue.add(i);
}
System.out.println("Input Queue Size:" + queue.size());
HeavyWorkRunnable hr = new HeavyWorkRunnable();
Thread t1 = new Thread(new HeavyWorkRunnable(queue),"t1");
Thread t2 = new Thread(new HeavyWorkRunnable(queue),"t2");
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
//This method is returning empty Queue.
Queue<Integer> outputQueue = hr.getOutputQueue();
System.out.println("Printing Output Queue.." + outputQueue.size());
for(Integer i:outputQueue)
System.out.println(i);
System.out.println("Printing Done");
}
HeavyWorkRunnable.java 스레드가 파괴
public class HeavyWorkRunnable implements Runnable {
private Queue<Integer> outputQueue = new LinkedList<Integer>();
private Queue<Integer> inputQueue;
public HeavyWorkRunnable() {
}
public HeavyWorkRunnable(Queue<Integer> inputQueue) {
this.inputQueue = inputQueue;
}
@Override
public void run() {
System.out.println("Doing heavy processing - START "+Thread.currentThread().getName());
try {
processInputQueue();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Doing heavy processing - END "+Thread.currentThread().getName());
}
private void processInputQueue() {
while(inputQueue.peek()!=null){
System.out.println(Thread.currentThread().getName() + "-->input size -->"+ inputQueue.size());
outputQueue.add(inputQueue.remove());
System.out.println(Thread.currentThread().getName() + "-output size -->"+ outputQueue.size());
}
}
public Queue<Integer> getOutputQueue() {
return this.outputQueue;
}
}
당신은 다중 스레드에서'LinkedList'를 큐로 사용하고 있습니다. 스레드로부터 안전하지 않으므로 동기화를 사용하지 않습니다. 당신이 할 때까지 제대로 작동하지 않습니다. – EJP