Java 使用5个线程添加数字

Java 使用5个线程添加数字,java,multithreading,synchronized,Java,Multithreading,Synchronized,问题:我必须创建5个线程,每个线程都必须执行加法操作 线程1-将1添加到10 螺纹2-将1添加到50 螺纹3-将5添加到15 螺纹4-将10添加到20 螺纹5-添加15到20 实现这一目标的最佳方式是什么?此外,我需要1秒的时间延迟之间的每个加法操作。我编写了以下代码: 我的输出错误,每次都在变化。我知道问题是同步的,但无法解决 class adding implements Runnable{ int a,b; public adding(int a, int b){

问题:我必须创建5个线程,每个线程都必须执行加法操作

  • 线程1-将1添加到10
  • 螺纹2-将1添加到50
  • 螺纹3-将5添加到15
  • 螺纹4-将10添加到20
  • 螺纹5-添加15到20
实现这一目标的最佳方式是什么?此外,我需要1秒的时间延迟之间的每个加法操作。我编写了以下代码: 我的输出错误,每次都在变化。我知道问题是同步的,但无法解决

class adding implements Runnable{
    int a,b; 
    public adding(int a, int b){
        this.a = a;
        this.b = b;
    }
    public void run() {
        add(a,b);
    }
    public void add(int a, int b){
        int sum=0;
        synchronized (this) {
            for(int i=a;i<=b;i++){
                sum = sum+ a;
            }
            System.out.println("Sum of "+a+" to "+ b+" numbers = "+sum);    
        }
    }
}

public class addnumbersusing5threads {
    public static void main(String[] args) {
        Thread t1 = new Thread(new adding(1,10));
        Thread t2 = new Thread(new adding(1,50));
        Thread t3 = new Thread(new adding(5,15));
        Thread t4 = new Thread(new adding(10,20));
        Thread t5 = new Thread(new adding(15,20));
        t1.start();
        t2.start();
        t3.start();
        t4.start();
        t5.start();
    }
}
问题是:

sum = sum + a;
它应该是
sum+=i

顺便说一句,这里不需要任何同步

如果您想在添加之间获得延迟,请使用
Thread.sleep(1000L)

线程.睡眠(1000L)
添加到您的添加方法

   public void add(int a, int b) throws InterruptedException {
        int sum=0;
        synchronized (this) {
            for(int i=a;i<=b;i++){
                sum += i;
                Thread.sleep(1000L); // Add this line for one second delay on each addition
            }
            System.out.println("Sum of "+a+" to "+ b+" numbers = "+sum);

        }
    }
public void add(inta,intb)抛出InterruptedException{
整数和=0;
已同步(此){

对于(inti=a;i,根据Lashane,这里不需要同步-在
sum
上没有争用,因为每个线程都有自己的变量。(如果确实需要同步,因为对象引用的作用域在类之外,并且可能会发生死锁-相反,在私有字段对象上进行同步,例如,
private final object lock=new object();


如果要将监视器用作互斥保护,则需要围绕a和b的读写进行同步。(同时,请将类名以大写字母开头!)是否希望结果按以下顺序显示(1到10,然后1到50,等等),或者只要操作之间有一秒钟的延迟,顺序就不相关了?顺序不重要,但如果它重要呢?你能解释一下这两种方法吗?我认为为了维持顺序,应该使用线程连接。@BadZen
a
b
是局部变量。它们对多个线程不可见,因此ey不需要同步。我相信,您需要同步来实现两次计算之间的1s延迟。或者,您从
线程
实现中取出打印语句,让调用方等待每个线程完成,然后按所需顺序/按所需时间打印结果。@Free昵称是最简单的方法任何线程等待一秒钟都是调用
thread.sleep(1000)
。这不是“同步”因为它不会影响除调用它的线程之外的任何线程。@jameslarge,这取决于任务的解释。我猜,您假设,在每个
sum=sum+a;
操作之间应该有1秒的延迟。在这种情况下,我同意您的意见。但是,我相信,任务要求在调用t的过程中添加暂停他使用了
add()
函数(更有可能,因为任务似乎专门用于线程同步),对
add()
函数的每次调用都在一个单独的线程上执行。因此,我们必须同步它们。
   public void add(int a, int b) throws InterruptedException {
        int sum=0;
        synchronized (this) {
            for(int i=a;i<=b;i++){
                sum += i;
                Thread.sleep(1000L); // Add this line for one second delay on each addition
            }
            System.out.println("Sum of "+a+" to "+ b+" numbers = "+sum);

        }
    }
 public void add(int a, int b){
    int sum=0;
    for(int i=a;i<=b;i++){
        sum = sum + i;
        Thread.sleep(1000);
    }
    System.out.println("Sum of "+a+" to "+ b+" numbers = "+sum);
}
...
t4.start();
t5.start();
// Join
t1.join();
t2.join();
...