(OJ)Java多线程-多线程打印数字

多线程打印数字

Problem Description

利用多线程按要求打印数字,线程计数从100开始,Thread1先打印101,102,103,104,105,106,107,108,然后是Thread2打印109,110,111,112,113,114,115,116,然后是Thread3打印117,118,119,120,121,122,123,124,接着再由Thread1打印125,126,127,128,129,130,131,132….以此类推, 直到打印到204。
请将前半部分代码补充完整。


// 你的代码将嵌入这里
public class Main {
    public static void main(String[] args) throws InterruptedException {
         object o = new object();    // 注意,O这里应该是大写,是Java祖先对象object,因为系统原因改不过来
        new Thread(new PrintRunnable(1,o)).start();
        new Thread(new PrintRunnable(2,o)).start();
        new Thread(new PrintRunnable(3,o)).start();
    }
}

Output Description

Thread1:101
Thread1:102
Thread1:103
Thread1:104
Thread1:105
Thread1:106
Thread1:107
Thread1:108
Thread2:109
Thread2:110
Thread2:111
Thread2:112
Thread2:113
…(此处省去中间打印的内容)
Thread1:200
Thread1:201
Thread1:202
Thread1:203
Thread1:204

解题代码

// PrintRunnable类 实现Runnable接口
class PrintRunnable implements Runnable {
    
    
    // 全局变量num 用于记录打印的数字
    private static int num = 100;
    // 全局变量 cur 用于记录当前运行的线程id
    private static int cur = 1;
    // lock锁对象
    private Object lock = null;
    // 线程的id
    private int id;

    // 构造器 接收id和锁对象
    public PrintRunnable(int id, Object lock) {
    
    
        this.lock = lock;
        this.id = id;
    }

    // 打印数字的方法 
    public void print() {
    
    
        // 每个线程只打印8次
        for (int i = 0; i < 8; i++) {
    
    
            // 将num++ 
            num++;
            // 如果num > 204 退出循环 只打印到204
            if (num > 204) break;
            // 打印线程名信息 和 数字
            System.out.println("Thread" + id + ":" + num);
        }
    }


    // 实现run方法 线程启动之后会执行run方法中的逻辑
    @Override
    public void run() {
    
    
        // 循环
        while (true) {
    
    
            // 使用synchronized 同步代码块 防止线程并发
            // synchronized是比较重量级的锁 对性能有一定的影响
            synchronized (lock) {
    
    
                // 判断当前打印数字的线程id是否等于正在执行线程id
                // 如果相等
                if (cur == id) {
    
    
                    // 调用打印数字的方法
                    print();
                    // 设置下一个打印线程的id
                    cur = cur + 1;
                    // 由于只有三个线程 因此当前运行的线程id大于3时 将值设置为1
                    if (cur > 3) cur = 1;
               	// 如果没有轮到当前执行的线程打印
                } else {
    
    
                    // 唤醒其它线程
                    lock.notifyAll();
                    // 异常处理 try catch
                    try {
    
    
                        // 如果数字大于204 结束循环 
                        // 结束循环意味着run方法执行完毕 线程执行完成
                        if (num > 204) {
    
    
                            break;
                        // 否则 线程进入等待状态
                        } else {
    
    
                            // wait方法会释放synchronized同步锁并使当前线程进入等待状态
                            lock.wait();
                        }
                    } catch (Exception e) {
    
    
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_40856560/article/details/112723708