欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一道考察多线程基本功的题目

程序员文章站 2022-07-12 08:54:05
...

多线程基本功


题目

启动两个线程, 一个输出 1,3,5,7…99, 另一个输出 2,4,6,8…100 最后 STDOUT 中按序输出 1,2,3,4,5…100。
要求用 Java 的 wait + notify 机制来实现


提示:wait和notify必须配合synchronized使用

代码

public class PrintNum{

    //可以是任意一个对象,或者自定义的对象
    static Object o1 = new Object();
    public static volatile List<Integer> list1=new ArrayList<>();
    public static volatile List<Integer> list2=new ArrayList<>();

    public static volatile List<Integer> mergelist=new ArrayList<>();
    public static void main(String[] args) {

        Thread a = new Thread(()->{
            synchronized (o1) {//ThreadB获取o1的对象锁
                System.out.println("偶数开始打印-------");
                for (int i = 1; i <= 100; i++) {
                    if(i%2==0){
                        System.out.print(i+" ");
                        list2.add(i);
                    }
                }
                o1.notify();//ThreadB释放o1的对象锁,通知其他等待o1对象锁的线程继续运行
            }
        });
        a.start();
        Thread b = new Thread(()->{
            synchronized (o1) {//ThreadB获取o1的对象锁
                System.out.println("");
                System.out.println("奇数开始打印-------");
                for (int i = 1; i <= 100; i++) {
                    if(i%2!=0){
                        System.out.print(i+" ");
                        list1.add(i);
                    }
                }
                o1.notify();//ThreadB释放o1的对象锁,通知其他等待o1对象锁的线程继续运行
            }
        });
        b.start();
        synchronized (o1)// 主线程获取o1的对象锁
        {
            try {
                System.out.println("");
                System.out.println("等俩个线程打印完执行总的打印---------");
                o1.wait(200);//o1的对象锁释放,主线程进入等待状态
                for (int i = 0; i < list1.size(); i++) {
                    System.out.print(list1.get(i)+" "+list2.get(i)+" ");

                }
            } catch (InterruptedException e) {
            }
        }
    }
}

运行结果:

一道考察多线程基本功的题目

相关标签: 日常练习