我的任务是创建一个项目,在该项目中,3名协调员将200名学生添加到1门课程中。我使用了一个线程池,最后打印出了注册到该课程的学生编号数组。
出于某些原因--在大多数情况下,当我运行java主程序时,它确实会向数组中添加200名学生-但是!每隔一段时间,它就会分配更少的值,并告诉我数组的大小是160,170...求求你,如果你知道是什么原因,我希望你能帮上忙。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ClassMain
{
public static void main(String[] args)
{
ExecutorService executor = Executors.newFixedThreadPool(3);
for (int i = 1; i <= 200 ;i++) {
Runnable coordinator = new Coordinator(i);
executor.execute(coordinator);
}
executor.shutdown();
while (!executor.isTerminated());
Coordinator.print();
}
}
import java.util.ArrayList;
public class Coordinator implements Runnable
{
public static ArrayList<Integer> javaStudents;
private int studentNumber;
public Coordinator(int studentNum)
{
studentNumber = studentNum;
javaStudents = new ArrayList<Integer>();
}
public static synchronized void processCommand(int studentNumber)
{
javaStudents.add(studentNumber);
}
@Override
public void run()
{
System.out.println(Thread.currentThread().getName() + " Starting to add student# " + studentNumber + " to Java");
processCommand(studentNumber);
System.out.println(Thread.currentThread().getName() +" Ended adding student#" + studentNumber + " to Java");
}
public static void print()
{
for (int i = 0; i < javaStudents.size(); i++) {
System.out.println("Student #" +javaStudents.get(i) + " enrolled to Java");
}
System.out.println("Array size: " + javaStudents.size());
}
}
我希望数组大小始终为200,但在某些运行中它会有所不同……
发布于 2019-06-05 03:12:23
Coordinator
构造函数中的这一行就是问题所在:
javaStudents = new ArrayList<Integer>()
每次构造Coordinator
时,您都会覆盖static
javaStudents
字段。删除此行,并将static
字段声明更改为:
public static ArrayList<Integer> javaStudents = new ArrayList<>();
https://stackoverflow.com/questions/56449884
复制相似问题