0
点赞
收藏
分享

微信扫一扫

每日学Java之多线程协作

静鸡鸡的JC 2022-03-14 阅读 53

线程协作示例

假定往篮子里放球与取球的规则如下:篮子只能装一个球;当篮子里无球时才能往里放球;当篮子里有球时才能从中取球。实现这个规则,就是解决两个线程间的协作问题,其程序代码如下:

package com.company;

import java.util.ArrayList;
import java.util.List;

// write your code here
public class WaitNotify {
    List<Object> balls = new ArrayList<Object>();
    int count_put = 1;   //计数
    int count_get = 1;

    public static void main(String args[]) {
        WaitNotify basket = new WaitNotify();//创建被监视的对象
        for (int i = 0; i < 3; i++) {
            //下面两个线程操作同一对象,需要协作
            new Thread(new AddThread(basket)).start();
            new Thread(new GetThread(basket)).start();
            //如果内部类没有使用static修饰时,则创建内部类实例的方法如下:
            //new Thread(new WaitNotify().new GetThread(basket)).start();

        }
    }

    public synchronized void putball(Object ball) {//放球方法
        if (balls.size() > 0) {
            try {
                this.wait();  //阻塞线程
            } catch (InterruptedException e) {
            }
        }
        balls.add(ball);
        notifyAll();//唤醒阻塞队列的其他线程到就绪队列
        System.out.println("放第" + count_put + "个球");
        count_put++;
    }

    public synchronized Object getball(Object ball) {//取球方法
        if(balls.size() == 0){
            try {
                //阻塞线程
                this.wait();
            } catch (InterruptedException e){
            }

        }
        ball = balls.get(0);
        balls.clear();//清空篮子
        notifyAll();//唤醒阻塞队列的其他线程到就绪队列
        System.out.println("取第" + count_get + "个球");
        count_get++;
        return ball;
    }

    static class AddThread extends Thread {//内部静态类,放球线程
        private WaitNotify basket;
        private Object ball = new Object();

        public AddThread(WaitNotify basket) {//构造方法
            this.basket = basket;
        }

        public void run() {
            basket.putball(ball);
        }
    }

    static class GetThread extends Thread {//内部静态类,取球线程
        private WaitNotify basket;
        private Object ball = new Object();

        public GetThread(WaitNotify basket) {//构造方法
            this.basket = basket;
        }

        public void run() {
            basket.getball(ball);
        }

    }
}

程序运行结果如图: 

举报

相关推荐

0 条评论