线程被破坏时变量被破坏了吗?

时间:2017-03-05 05:53:03

标签: java multithreading

我想通过2个线程处理Queue的元素,并按照与输入相同的顺序准备OutputQueue。我仍然需要制作一些同步块,但我仍然坚持以下问题。

  1. 返回空的OutputQueue
  2. 我这样做是否正确。
  3. 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;
        }
    }
    

1 个答案:

答案 0 :(得分:4)

  

当一个线程被破坏时,变量被破坏了吗?

run()方法调用终止时,线程堆栈将被丢弃,线程对其Runnable的引用将被清零。到那时,所有run()方法的局部变量都将超出范围。

Runnable无法访问时,它会被垃圾回收。 GC最终会摧毁&#34; Runnable的实例变量。

  

我是以正确的方式做到这一点。

我会使用ExecutorService,并通过创建Future方法返回的submit(...)对象列表来处理排序输出的问题。

在您的代码中,您似乎有三个不同的HeavyWorkRunnable实例,您似乎正在从没有传递给线程的实例中检索输出队列。这对我来说并不合适。共享输入队列上也存在(缺少)同步问题。这可能会导致竞争条件和内存可见性问题。

  

返回空的OutputQueue

是。这是&#34;三个实例的结果&#34;上面的问题。