n个线程顺序打印数字

思路分析:

1. 创建一个 PrintNumber 类实现 Runnable 接口,每个线程负责打印一部分数字。使用一个静态变量 number 来记录当前要打印的数字,使用一个对象锁 lock 来实现线程间的同步。

2. 在 run() 方法中,每个线程会进入一个循环,判断当前线程是否是轮到的线程。如果不是,线程会进入等待状态,直到被唤醒。如果是轮到的线程,线程会打印当前的数字,并将 number 加一。然后,线程会唤醒其他等待的线程。

3. 在 main() 方法中,创建n个线程,并启动它们。然后,使用 join() 方法(主线程)等待所有线程执行完毕。

代码实现:

public class PrintNumber implements Runnable {
    private static final Object lock = new Object();//共享对象锁
    private static int number = 1;//当前要打印的数字
    private int threadId;//线程ID
    private int numOfThreads;//线程总数

    public PrintNumber(int threadId, int numOfThreads) {//初始化
        this.threadId = threadId;
        this.numOfThreads = numOfThreads;
    }

    @Override
    public void run() {
        while (number <= 100) {
            //获取对象锁
            synchronized (lock) {
                //限定条件,满足条件才能继续,否则进入等待状态
                if (number % numOfThreads != threadId) {
                    try {
                        lock.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                //打印并递增
                if (number <= 100) {
                    System.out.println("线程号:" + (threadId+1) + " 打印数字:" + number);
                    number++;
                }
                lock.notifyAll();//唤醒其他线程
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {

        int numOfThread = 4;
        Thread[] threads = new Thread[numOfThread];

        //初始化
        for (int i = 0; i < numOfThread; i++) {
            threads[i] = new Thread(new PrintNumber(i, numOfThread));
        }

        //启动!
        for(int i=0;i

你可能感兴趣的:(面试编程题,java,jvm,开发语言)