笔记 - 14 多线程 synchronized CountDownLatch wait notify 练习

题目1

请利用线程间通信, 完成连续打印1-100的数字, 要求一条线程专门打印奇数,另外一条专门用来打印偶数

要求:

1:数字打印必须是有序的,既1–100的顺序不能乱;

2:必须使用多线程技术;

效果:

笔记 - 14 多线程 synchronized CountDownLatch wait notify 练习_第1张图片

​ …

笔记 - 14 多线程 synchronized CountDownLatch wait notify 练习_第2张图片

参考答案:

public class A {
     
        public static int number  = 1;
        public static void main(String[] args) {
     
            Object lock = new Object();
            //第一个线程专门负责打印偶数
            new Thread(()->{
     
                while (true) {
     
                    synchronized (lock) {
     
                        lock.notify();//唤醒对方;(注意,即使对方醒了也无法立刻进入synchronized包裹的代码)
                        //如果是奇数, 该条线程等待
                        if(number%2 == 1){
     
                            try {
     
                                lock.wait();//等待的时候,会释放锁,那么对方就可以执行了
                            } catch (InterruptedException e) {
     
                                e.printStackTrace();
                            }
                        }else {
     
                            System.out.println("第1条线程打印偶数:" + number);
                            number++;
                            if (number == 101) {
     // 这个是打印偶数的线程,如果++后101就结束循环
                                //如果数字大于等于100就应该停止循环
                                break;
                            }
                        }
                    }
                }
            }).start();
            //第2个线程专门负责打印奇数,
            new Thread(()->{
     
                while (true) {
     
                    synchronized (lock) {
     
                        lock.notify();//唤醒对方;(注意,即使对方醒了也无法立刻进入synchronized包裹的代码)
                        //如果是偶数, 该条线程等待
                        if(number%2 == 0){
     
                            try {
     
                                lock.wait();
                            } catch (InterruptedException e) {
     
                                e.printStackTrace();
                            }
                        }else {
     
                            System.out.println("第2条线程打印奇数:" + number);
                            number++;
                            if (number == 100) {
     
                                break;
                            }
                        }
                    }
                }
            }).start();
        }
}

题目2

假如某班级有10人,早晨老师来到教室之后,需要等待10位学生都到齐了才会开始上课,如果10位学生还没有到齐,老师需要一直等待;假如把老师和每一个学生都看成是一个独立的线程,请使用代码模拟这个老师上课的场景;

要求:

1:老师上课之前,打印老师准备就绪,等所有学生到齐之后,老师打印开始讲课;

2:只有10个学生都到了,老师才可以上课;

效果:

笔记 - 14 多线程 synchronized CountDownLatch wait notify 练习_第3张图片

参考答案:

public class A {
     
    public static void main(String[] args) {
     
        CountDownLatch c = new CountDownLatch(10);
        Teacher t = new Teacher(c);
        new Thread(t, "张老师").start();
        for (int i = 1; i <= 10; i++) {
     
            Student s = new Student(c);
            new Thread(s, "学生" + i).start();
        }
    }
}
class Teacher implements Runnable {
     
    private CountDownLatch c;
    public Teacher(CountDownLatch c) {
     
        this.c = c;
    }
    public void run() {
     
        try {
     
            System.out.println(Thread.currentThread().getName() + "已经准备好讲课了,正在等待同学们到齐...");
            c.await();
            System.out.println(Thread.currentThread().getName() + "开始讲java多线程了...");
        } catch (InterruptedException e) {
     
            e.printStackTrace();
        }
    }
}
class Student implements Runnable {
     
    private CountDownLatch c;
    public Student(CountDownLatch c) {
     
        this.c = c;
    }
    @Override
    public void run() {
     
        System.out.println(Thread.currentThread().getName() + "到了...");
        c.countDown();
    }
}

题目3[业务比较复杂,有难度呦]

假如现在有一辆公交车,车上有两个乘务员,一个专门负责让乘客上车,并提示目前车上的人数,另一个乘务员专门负责乘客下车,并提示乘客下车后,目前车上的人数,请使用代码模拟这个场景;

要求:

1:公交车最多乘坐30位乘客,如果超过30人,则上车的乘务员不再安排乘客上车,会一直等待,直到车上有空位子再安排乘客上车;

2:如果车上乘客数量为0了,则不再乘客下车,直到车上有乘客,再继续安排乘客下车;

3:每次上下车的人数采用随机数的方式表示上车的人数和下车的人数,且上车时,1次最多上当前最大空余座位数,最少是1人,下车时,1次最多下当前车上总乘客数,最少是1人;

效果:

笔记 - 14 多线程 synchronized CountDownLatch wait notify 练习_第4张图片

参考答案:

public class Demo3 {
     
    public static void main(String[] args) {
     
        Bus bus = new Bus();
        new Thread(new Runnable() {
     
            @Override
            public void run() {
     
                while (true) {
     
                    bus.getOn();
                }
            }
        }).start();
        new Thread(new Runnable() {
     
            @Override
            public void run() {
     
                while (true) {
     
                    bus.getOff();
                }
            }
        }).start();
    }
}
class Bus {
     
    //车上最多有30个人
    private int count = 0;

    //上车的方法
    public void getOn() {
     
        synchronized (this) {
     
            // 够30个就得等
            if (count >= 30) {
     
                try {
     
                    this.wait();
                } catch (InterruptedException e) {
     
                    e.printStackTrace();
                }
            }
            //一次上多个
            Random random = new Random();
            int number = random.nextInt(30 - count) + 1;
            count += number;
            System.out.println("上去了" + number + "个人,现在车上有" + count);
            // 叫醒下车线程
            this.notify();
        }
    }

    //下车的方法
    public void getOff() {
     
        synchronized (this) {
     
            if (count <= 0) {
     
                try {
     
                    this.wait();
                } catch (InterruptedException e) {
     
                    e.printStackTrace();
                }
            }
            //0的时候就得等
            // count--;
            Random random = new Random();
            int number = random.nextInt(count) + 1;
            count -= number;
            System.out.println("下去了" + number + "个人,现在车上有" + count);
            //叫醒上车线程
            this.notify();
        }
    }
}

你可能感兴趣的:(笔记,java,多线程,并发编程,sync)