使用多线程计算Java

时间:2016-06-07 19:01:06

标签: java multithreading mutex semaphore synchronized

我想使用多线程来计算1万个整数的总和(从1到10000)。我对同步键工作有基本的了解。我知道synchronized在执行期间一次只允许一个线程,而信号量一次只允许一定数量的线程。

以下是使用synchronized关键字的实现:

public class Testing {
private static int sum = 0;
private static int one = 1;
public synchronized static void increment() {
    sum = sum + one;
    one++;
}
public static void main(String[] args) {
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 5000; i++) {
                increment();
            }
        }
    });
    Thread t2 = new Thread(new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i < 5000; i++) {
                increment();
            }
        }
    });
    t1.start();;
    t2.start();
    try {
        t1.join();
        t2.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(sum);
  }
}

我的解决方案:将1万个数字分成两部分。使用两个线程来计算每个部分。

问题:使用信号量有更好的方法吗?我在这里使用了synchronized,但是我们应该使用信号量吗?在这种情况下,我们应该如何使用信号量进行改进?

1 个答案:

答案 0 :(得分:1)

如果您想要求一个整数而不是整数,请查看ForkJoinTask

如果您正在尝试了解信号量使用情况,请检查Semaphore simple sample

修改 将您的增量()更改为

public static void increment() 
    {
        try
        {
            semaphore.acquire();
        }
        catch (InterruptedException e)
        {
            //process excp
        }
        sum = sum + one;
        one++;
        semaphore.release();
    }

并添加

private static Semaphore semaphore = new Semaphore(1); 

作为类变量

但正如其他人所说,这不是解决问题的正确方法。 另外,如果您正在寻找wait()/ notify()信号量模型,您仍然需要使用synchronized。