有人可以解释这个Java ThreadPool吗?

时间:2019-01-29 13:38:36

标签: java multithreading concurrency synchronization threadpool

我已经为1000个线程创建了FixedThreadPool。 每个单独的线程都需要将全局计数器加1。 因此,实际上这是编程任务的一部分,我不希望直接回答,而且我已经在这个问题上花费了几个小时。

因此,一些建议将不胜感激。这是我的代码:

public class ThreadSpawner {
private int sum = 0;
public static void main(String[] args){
    ThreadSpawner ts = new ThreadSpawner();
    ts.doWork();

}

public void doWork(){
    ExecutorService executor = Executors.newFixedThreadPool(1000);     
    for(int i =0;i<1000;i++){
        executor.execute(new Runnable(){

            @Override
            public void run() {
                System.out.println("Value: " + sum + Thread.currentThread());
                counter();
                }

            public synchronized void counter(){
                sum++;
            }
            });
        }
        executor.shutdown();
    }
}

该分配具体询问此问题:“编写一个启动1,000个线程的程序。每个线程将1加到变量和上 最初为0。定义一个Integer包装器对象以保存sum。有无运行程序 同步看其效果。 您可以使用newFixedThreadPool()在池中创建固定数量的线程。

我已经为线程使用了单独的可运行taskClass进行了尝试。但是我找不到从线程内编辑sum变量的方法。

Im现在使用的这种内螺纹方式至少显示出一些正确的行为。

任何人都可以提供一些见解,以解决该问题的更正确方法是什么?

  • 我也不确定如何以及在何处实现sync关键字来正确地强制线程进行同步。

亲切的问候! Sietze

1 个答案:

答案 0 :(得分:0)

对于任何有兴趣的人,我都提供了作者的解决方案。我认为在这种情况下发布此类解决方案是一种坏习惯,因此我将其删除。

import java.util.concurrent.*;

public class Exercise30_04 {
  private int sum = new Integer(0);

  public static void main(String[] args) {
    Exercise30_04 test = new Exercise30_04();
    System.out.println("What is sum ? " + test.sum);
  }

  public Exercise30_04() {
    ExecutorService executor = Executors.newFixedThreadPool(1000);

    for (int i = 0; i < 1000; i++) {
      executor.execute(new SumTask());
    }

    executor.shutdown();

    while(!executor.isTerminated()) {
    }
  }

  class SumTask implements Runnable {
    public void run() {
      sum++;
//      int value = sum.intValue() + 1;
//      sum = new Integer(value);
    }
  }
}

此解决方案似乎在没有synced关键字的情况下运行1000的正确结果。

那么在这里实现synced关键字是否有意义? 我个人将其放在可运行类的run方法上。

无论如何,感谢大家的回应。