[英]How to make sure threads are being fully executed? (using thread pool)
我的任務是創建一個程序,其中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,但在某些情況下會有所不同...
您的Coordinator
構造函數中的這一行是問題所在:
javaStudents = new ArrayList<Integer>()
每次構造Coordinator
器時,您都將覆蓋static
javaStudents
字段。 刪除此行,並將您的static
字段聲明更改為:
public static ArrayList<Integer> javaStudents = new ArrayList<>();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.