java多线程依次按顺序输出自然数

2021-03-02 10:48:29 浏览数 (1)

场景需求
代码语言:javascript复制
创建三个线程,按顺序执行,每个线程输出两个自然数,依次执行

`例:
线程A-1
线程A-2
线程B-3
线程B-4
线程C-5
线程C-6
`

实现方案一

  1. 实现Runnable,重写run()
  2. 使用可重入锁synchronized 保证线程安全
  3. 使用new Thread(方法名).start()创建多个线程
完整代码?
代码语言:javascript复制
public class ThreadPoolTest {
    public static void main(String[] args) throws InterruptedException {
        method method = new method();

//        创建三个线程,并自定义名称
        new Thread(method, "2").start();
        new Thread(method, "1").start();
        new Thread(method, "0").start();
    }
}

class method implements Runnable {
    int num = 1;
    int threadId = 0;

    @Override
    public void run() {
//        循环执行三次,根据实际需要设置
        for (int i = 0; i < 3; i  ) {
            print();
        }
    }
//  	加了synchronized,同步的方法,线程安全
    public synchronized void print() {

//        获取线程的名称,名称是我们自定义的1、2、3....
        int name = Integer.parseInt(Thread.currentThread().getName());
//        从线程0开始判断是否是我们预期的线程
        while ((threadId % 3) != name) {
//            如果不是则等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
//      如果是我们预期的线程,这个线程执行自定义次的任务
        for (int i = 0; i < 2; i  ) {
            System.out.println("线程>>"   name   " : "   num);
            num = num   1;
        }
//        执行完后预期的线程名加1
        threadId = threadId % 3   1;  //线程名称加1
//      通知其他线程执行
        this.notifyAll();

    }
}

实现方案二

  1. 创建匿名内部类Runnable,重写run()
  2. 使用可重入锁synchronized 保证线程安全
  3. 使用new Thread(方法名).start()创建多个线程
完整代码?
代码语言:javascript复制
public class ThreadPoolTest {
    public static void main(String[] args) throws InterruptedException {
        method method = new method();

//        创建三个线程,并自定义名称
        for (int i = 0; i < 3; i  ) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    method.print();
                }
            }, Integer.toString(i)).start();
        }
    }
}

class method {
    int num = 1;
    int threadId = 0;
    
    public synchronized void print() {
//        获取线程的名称,名称是我们自定义的1、2、3....
        int name = Integer.parseInt(Thread.currentThread().getName());
//        从线程0开始判断是否是我们预期的线程
        while ((threadId % 3) != name) {
//            如果不是则等待
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
//      如果是我们预期的线程,这个线程执行自定义次的任务
        for (int i = 0; i < 6; i  ) {
            System.out.println("线程>>"   name   " : "   num);
            num = num   1;
        }
//        执行完后预期的线程名加1
        threadId = threadId % 3   1;  //线程名称加1
//      通知其他线程执行
        this.notifyAll();

    }


}

0 人点赞