首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何确保线程被完全执行?(使用线程池)

如何确保线程被完全执行?(使用线程池)
EN

Stack Overflow用户
提问于 2019-06-05 03:03:59
回答 1查看 50关注 0票数 0

我的任务是创建一个项目,在该项目中,3名协调员将200名学生添加到1门课程中。我使用了一个线程池,最后打印出了注册到该课程的学生编号数组。

出于某些原因--在大多数情况下,当我运行java主程序时,它确实会向数组中添加200名学生-但是!每隔一段时间,它就会分配更少的值,并告诉我数组的大小是160,170...求求你,如果你知道是什么原因,我希望你能帮上忙。

代码语言:javascript
复制
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();
    }
}
代码语言:javascript
复制
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,但在某些运行中它会有所不同……

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 03:12:23

Coordinator构造函数中的这一行就是问题所在:

代码语言:javascript
复制
javaStudents = new ArrayList<Integer>()

每次构造Coordinator时,您都会覆盖static javaStudents字段。删除此行,并将static字段声明更改为:

代码语言:javascript
复制
public static ArrayList<Integer> javaStudents = new ArrayList<>();
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56449884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档