簡體   English   中英

如何確保線程被完全執行? (使用線程池)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM