Java 使用5个线程添加数字
问题:我必须创建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){
- 线程1-将1添加到10
- 螺纹2-将1添加到50
- 螺纹3-将5添加到15
- 螺纹4-将10添加到20
- 螺纹5-添加15到20
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,等等),或者只要操作之间有一秒钟的延迟,顺序就不相关了?顺序不重要,但如果它重要呢?你能解释一下这两种方法吗?我认为为了维持顺序,应该使用线程连接。@BadZena
和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();
...