我的程序运行成功,但我不知道为什么列表大小始终为零。哪个不应该为零。 虚拟文本========================== 虚拟文本=========================== 虚拟文本=========================
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();
}
}
答案 0 :(得分:1)
您创建了3个Worker实例:第一个实例位于main中。它的列表永远不会被触及,最终是你决定打印的列表。
在内部决策方法中,您创建两个新的Workers,每个都有自己的列表。每个工作人员只更改其列表 - 但这些更改永远不会反映在主要工作人员的列表中。
长话短说,你需要&#34;分享&#34;所有工人中的那些清单:使这些清单成为静态和最终的。这应该解决它。