Executor Service问题,列表大小始终为零?

时间:2016-05-07 07:32:17

标签: java

我的程序运行成功,但我不知道为什么列表大小始终为零。哪个不应该为零。 虚拟文本========================== 虚拟文本=========================== 虚拟文本=========================

package ca.cgi.general;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

public class Worker implements Runnable {

    Random random = new Random();
    List<Integer> list1 = new ArrayList<Integer>();
    List<Integer> list2 = new ArrayList<Integer>();
    Object lock1 = new Object();
    Object lock2 = new Object();

    private void StageOne() {
        synchronized (lock1) {

            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }
            list1.add(random.nextInt());
        }

    }

    private void StageTwo() {
        synchronized (lock2) {

            try {
                Thread.sleep(1);
            } catch (InterruptedException e) {

                e.printStackTrace();
            }
            list2.add(random.nextInt());
            //System.out.println(list2.size());
        }
    }

    public void run() {
        System.out.println(Thread.currentThread().getName());
        for (int i = 1; i <= 1000; i++) {
            StageOne();
            StageTwo();
        }

    }

    public void decession() throws InterruptedException {
        long startTime = System.currentTimeMillis();

        ExecutorService executorService = Executors.newFixedThreadPool(2);
        for (int i = 0; i < 2; i++) {
            executorService.submit(new Worker());
        }
        executorService.shutdown();
        executorService.awaitTermination(15, TimeUnit.DAYS);
        System.out.println("All task comleted");
        long endTime = System.currentTimeMillis();
        System.out.println("Time Taken:" + (endTime - startTime));

        System.out.println("List1 " + list1.size());
        System.out.println("List2 " + list2.size());


    }

}

package ca.cgi.general;

public class TestThread {
public static void main(String[] args) {
    try {
        new  Worker().decession();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

1 个答案:

答案 0 :(得分:1)

您创建了3个Worker实例:第一个实例位于main中。它的列表永远不会被触及,最终是你决定打印的列表。

在内部决策方法中,您创建两个新的Workers,每个都有自己的列表。每个工作人员只更改其列表 - 但这些更改永远不会反映在主要工作人员的列表中。

长话短说,你需要&#34;分享&#34;所有工人中的那些清单:使这些清单成为静态和最终的。这应该解决它。