我想通过2个线程处理Queue的元素,并按照与输入相同的顺序准备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;
}
}
答案 0 :(得分:4)
当一个线程被破坏时,变量被破坏了吗?
当run()
方法调用终止时,线程堆栈将被丢弃,线程对其Runnable
的引用将被清零。到那时,所有run()
方法的局部变量都将超出范围。
当Runnable
无法访问时,它会被垃圾回收。 GC最终会摧毁&#34; Runnable
的实例变量。
我是以正确的方式做到这一点。
我会使用ExecutorService
,并通过创建Future
方法返回的submit(...)
对象列表来处理排序输出的问题。
在您的代码中,您似乎有三个不同的HeavyWorkRunnable
实例,您似乎正在从没有传递给线程的实例中检索输出队列。这对我来说并不合适。共享输入队列上也存在(缺少)同步问题。这可能会导致竞争条件和内存可见性问题。
返回空的OutputQueue
是。这是&#34;三个实例的结果&#34;上面的问题。