初学者 |线程池 |打印出每一个结果 |错误的结果

beginner | threadPool | printout every result | wrong result

我试图通过每个线程将 "global counter" 加 1。所以"global counter"的结果一定是10。 我打印出每个线程结果。大多数时候最后的结果是 10。但有时 10 不是最后一个数字。我用了synchronized或者lock,但是没用

谢谢。希望我的英文不会太差

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Hauptprogramm {

public static final int MAX_THREADS = 10;
public static int globalCounter;

public static void main(String[] args) {

 // create a pool of threads, 10 max jobs will execute in parallel
 ExecutorService threadPool = Executors.newFixedThreadPool(MAX_THREADS);

 // submit jobs to be executing by the pool
 for (int i = 0; i < MAX_THREADS; i++) {
   threadPool.submit(new Runnable() {

     public void run() {
       // some code to run in parallel
       globalCounter++;


        String originalName = Thread.currentThread().getName();
       System.out.println("Result: "+globalCounter+"  "+originalName);


       try {
         Thread.sleep(1000);

       } catch (InterruptedException e) {

       }

     }
   });
 }
   threadPool.shutdown();
  }
 }

我不知道这次测试的预期是什么,因为我还没有 50 的声誉,我不能添加评论。

Java线程在JVM中是运行,无法从高层控制资源分配,如果要求有线程依次开始执行,使用release-lock机制,但是不能保证它会按顺序执行,如果你要求按顺序执行,你需要做一些逻辑来识别哪个线程需要一个接一个地执行。

我认为现在是:

            public void run() {
                synchronized(Hauptprogramm.class)
                  {


                globalCounter++;

                String originalName = Thread.currentThread().getName();
                System.out.println("Result: " + globalCounter + "  " + originalName);

                try {
                    Thread.sleep(100);

                } catch (InterruptedException e) {

                }

                  }
            }});
        }

    threadPool.shutdown();
}
}