用实现接口Runable方式写一个三线程的程序,分别在屏幕上打印0,0+1,0+1+2,0+1+2+…+100各个算式的值。给线程加同步方法
时间: 2023-12-10 20:02:58 浏览: 65
好的,我来为您提供代码:
```
public class MyRunnable implements Runnable {
private int start;
private int end;
private int sum;
private Object lock;
public MyRunnable(int start, int end, Object lock) {
this.start = start;
this.end = end;
this.lock = lock;
}
public synchronized void addSum(int num) {
sum += num;
}
@Override
public void run() {
int temp = 0;
for (int i = start; i <= end; i++) {
temp += i;
System.out.println(Thread.currentThread().getName() + ": " + temp);
}
addSum(temp);
synchronized (lock) {
lock.notifyAll();
}
}
public static void main(String[] args) {
Object lock = new Object();
MyRunnable r1 = new MyRunnable(0, 0, lock);
MyRunnable r2 = new MyRunnable(0, 1, lock);
MyRunnable r3 = new MyRunnable(0, 2, lock);
Thread t1 = new Thread(r1, "Thread-1");
Thread t2 = new Thread(r2, "Thread-2");
Thread t3 = new Thread(r3, "Thread-3");
t1.start();
t2.start();
t3.start();
synchronized (lock) {
try {
lock.wait();
lock.wait();
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("0+1+2+...+100 = " + (r1.sum + r2.sum + r3.sum));
}
}
```
代码中,我们创建了一个 `MyRunnable` 类实现了 `Runnable` 接口,其构造函数需要传入起始值和结束值,并且还需要传入一个对象锁 `lock`。我们使用同步方法 `addSum` 来将每个线程的结果相加。在 `run` 方法中,我们使用 `temp` 变量来进行累加,并且在每个累加的过程中,将累加的结果输出到控制台上。然后将结果传给 `addSum` 方法中,最后使用 `notifyAll` 方法唤醒所有其他线程。
在 `main` 方法中,我们创建了三个 `MyRunnable` 对象,并且分别传入不同的起始值和结束值。然后,我们创建三个线程来分别启动这三个 `MyRunnable` 对象。在启动线程之后,我们使用 `wait` 方法来等待所有线程运行完毕,最后输出累加结果。
注意,我们使用了同步方法和对象锁来保证线程安全,并且在每次累加过程中,输出了算式的值。
阅读全文