Java基础 线程5作业

1、编程题

(1)在main方法中启动两个线程

(2)第一个线程循环随机打印100以内的整数

(3)直到第2个线程从键盘读取了“Q"命令

/**
 * @ClassName HomeWork01
 * @Description
 * @Author 小黄debug
 * @Date 2022/3/22 22:16
 * @Version 1.0
 **/
public class HomeWork01 {
    public static void main(String[] args) {
        A a = new A();
        a.start();
        B b = new B(a);
        b.start();

    }
}

class A extends Thread{
    private boolean flag = true;

    public void setFlag(boolean flag) {
        this.flag = flag;
    }

    @Override
    public void run() {
        while(flag){
            int i = (int) (Math.random() * 100 + 1);
            System.out.println(i);

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }
    }
}
class B extends Thread{
    private Scanner scanner = new Scanner(System.in);
    private A a;

    public B(A a){
        this.a = a;
    }

    public void run(){
        //接收用户的输入
        while(true) {
            System.out.println("请输入指令(Q)表示退出");
            char key = scanner.next().toUpperCase().charAt(0);
            if(key == 'Q'){
                a.setFlag(false);
                break;
            }

        }
    }
}

2、编程题

(1)有两个用户分别从同一个卡取钱(总额:10000)

(2)每次都取1000,当余额不足时,就不能取款了

(3)不能出现超取现象=》线程同步问题

/**
 * @ClassName HomeWork02
 * @Description
 * @Author 小黄debug
 * @Date 2022/3/22 23:20
 * @Version 1.0
 **/
public class HomeWork02 {
    public static void main(String[] args) {
        Ticker ticker = new Ticker();
        Thread thread1 = new Thread(ticker);
        Thread thread2 = new Thread(ticker);

        thread1.start();
        thread2.start();
    }
}
class Ticker implements Runnable{
    private Integer picker = 10000;
    private boolean loop = true;

    @Override
    public void run() {
        while(loop) {
            //解读
            //1.这里使用synchronized实现了线程同步
            //2.当多个线程执行到这里时,就会去争夺this对象锁
            //3.哪个线程争夺(获取)this对象锁,就执行synchronized代码块,执行完成就会释放this对象
            //4.争夺不到this对象锁,就blocked,准备继续争夺
            synchronized(this){
                if(picker-1000 < 0){
                    loop = false;
                    break;
                }
                picker -= 1000;
                System.out.println(Thread.currentThread().getName()+"消费了1000,剩余"+picker);

            }

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值