Java 有服务台吗?

Java 有服务台吗?,java,multithreading,executorservice,Java,Multithreading,Executorservice,我想保留一个已执行线程的计数器,以便在我正在执行的相同线程中使用 这里的问题是,尽管计数器增加了,但增加不均匀,从控制台输出中我得到了这个结果(我有一个for循环,它使用ExecutorService执行5个线程): 如您所见,我没有得到1,2,3,4,5,而是得到3,4,4,4 我假设这是因为for循环的运行速度足够快,可以执行线程,而线程的运行速度足够快,可以执行请求计数器的代码,速度比计数器更新自身的速度还要快(这有意义吗?) 下面是代码(它更小,对计数器没有任何意义): for(int

我想保留一个已执行线程的计数器,以便在我正在执行的相同线程中使用

这里的问题是,尽管计数器增加了,但增加不均匀,从控制台输出中我得到了这个结果(我有一个for循环,它使用ExecutorService执行5个线程):

如您所见,我没有得到
1,2,3,4,5
,而是得到
3,4,4,4

我假设这是因为for循环的运行速度足够快,可以执行线程,而线程的运行速度足够快,可以执行请求计数器的代码,速度比计数器更新自身的速度还要快(这有意义吗?)

下面是代码(它更小,对计数器没有任何意义):

for(int i=0;i<5;i++)
{
螺纹;
线程=新线程()
{
公开募捐
{
System.out.println(“这是test.N:+aldo”);
//在这里有更多的东西,说它,因为它可能会减慢执行(如果这是罪魁祸首?)
返回;
}
};
线程列表。添加(线程);
}
//后来
对于(int i=0;i

是的,
aldo
计数器(我认为还有一些其他列表)在代码中缺失(它们非常简单)。
aldo
不被线程中的任务修改,而是在主线程中修改,如下所示:

for (int i = 0; i < threadList.size(); i++) {
    executor.execute(threadList.get(i));
    //here...
    aldo = aldo + 1;
}

我所知道的最好的方法是创建一个自定义线程类,其中包含一个传入数字的构造函数。保存数字的变量随后可用于任何需要的日志记录。这是我想出的代码

public static void main(String[] args) {
    class NumberedThread implements Runnable {
        private final int number;
        public NumberedThread(int number) {
            this.number = number;
        }

        @Override
        public void run() {
            System.out.println("This is test. N: " + number);
        }
    }

    List<Thread> threadList = new ArrayList<>();
    for (int i = 1; i  <  6; i++) threadList.add(new Thread(new NumberedThread(i)));

    ExecutorService executor = Executors.newFixedThreadPool(10);;
    for (Thread thread : threadList) executor.execute(thread);
    executor.shutdown();
    try {
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
    }
    catch (InterruptedException ignored) { }
}
publicstaticvoidmain(字符串[]args){
类NumberedThread实现可运行{
私人最终整数;
public NumberedThread(整数){
这个数字=数字;
}
@凌驾
公开募捐{
System.out.println(“这是test.N:+number”);
}
}
List threadList=new ArrayList();
对于(inti=1;i<6;i++)线程列表,添加(新线程(newnumberedthread(i));
ExecutorService executor=Executors.newFixedThreadPool(10);;
for(Thread-Thread:threadList)执行器。execute(Thread);
executor.shutdown();
试一试{
执行器等待终止(长最大值,时间单位纳秒);
}
catch(InterruptedException忽略){}
}

如果要命名线程,也可以使用字符串对象。

这当然可以完成任务,但问题仍然存在。我现在得到的是
3,4,4,3,5
,而不是
1,2,3,4,5
。您拥有代码的方式并不保证
aldo
在第一个线程运行时不会是3。使用
AtomicInteger
在这里也没有帮助。@tsolakp,那我该怎么办?你可以将
aldo
传递给每个线程,但按顺序打印它们仍然会有问题。这里最大的问题是“为什么你需要按顺序打印它们,你真的需要在这里使用线程吗?”我正在尝试制作某种程序,它可以处理比这5个线程多得多的线程。不幸的是,对于清理,我需要一种方法来识别哪个是哪个,因此我需要一个计数器。然后您可能不需要排序,只需将
aldo
传递给循环中的每个线程即可。这样每个线程都有其独特的价值。很高兴能够提供帮助!
for (int i = 0; i < threadList.size(); i++) {
    executor.execute(threadList.get(i));
    //here...
    aldo = aldo + 1;
}
AtomicInteger aldo = new AtomicInteger(1);

for (int i = 0; i < 5; i++) {
    executor.execute( () -> {
        System.out.println("This is test. N: " + aldo.getAndIncrement());
    });
}
public static void main(String[] args) {
    class NumberedThread implements Runnable {
        private final int number;
        public NumberedThread(int number) {
            this.number = number;
        }

        @Override
        public void run() {
            System.out.println("This is test. N: " + number);
        }
    }

    List<Thread> threadList = new ArrayList<>();
    for (int i = 1; i  <  6; i++) threadList.add(new Thread(new NumberedThread(i)));

    ExecutorService executor = Executors.newFixedThreadPool(10);;
    for (Thread thread : threadList) executor.execute(thread);
    executor.shutdown();
    try {
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
    }
    catch (InterruptedException ignored) { }
}