初学者| threadPool |打印输出每个结果|错误的结果

时间:2016-05-12 09:23:35

标签: java threadpool

我试图将1添加到"全球计数器"每个线程。所以"全球计数器的结果"必须是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();
  }
 }

2 个答案:

答案 0 :(得分:1)

我对这次考试的期望感到徘徊,因为我还没有50个声望,我无法添加评论。

Java线程在JVM中运行,在高级别的资源分配中无法控制,如果您被要求让线程开始执行,请使用释放锁定机制,但是没有保证它会按顺序执行,如果你按顺序执行它,你需要做一些逻辑来识别需要执行的线程。

答案 1 :(得分:0)

我认为现在就是这样:

            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();
}
}