5min挑战线程题

格局

		😎大家好💪,我是Cx_330是👨

​ 今天给大家分量两道有关线程的的编程题是😍😍在这里插入图片描述

🎏练习一

🧨题述:

🎄在main()方法中启用两个线程,第一个线程打印1~100以内的整数,直到线程2从键盘中读取了"Q"命令,线程1,2都自动结束

🧨代码演示

import java.util.Random;
import java.util.Scanner;

public class Thread {
    public static void main(String[] args) throws InterruptedException {
        T2 t2 = new T2();
        T1 t1 = new T1(t2);
        java.lang.Thread thread1 = new java.lang.Thread(t1);
        java.lang.Thread thread2 = new java.lang.Thread(t2);
        thread1.setDaemon(true);
        thread1.start();
        thread2.start();
    }
}
class T1 implements Runnable{

    private String str=null;
    private Scanner scanner=null;
    private T2 t2=null;
    //本体的题眼,在线程T1中接收线程T2创建的对象
    //进而通过T2对象控制T2中循环的条件
    //从而能够达到当T1输入Q时结束线程T2
    public T1(T2 t2){
        this.t2=t2;
    }
    @Override
    public void run() {
        scanner=new Scanner(System.in);
        while (true){
            str=scanner.next();
            if("Q".equals(str)){
                t2.setLeap(false);
                break;
            }
        }
        System.out.println("T1线程结束");
    }
}

class T2 implements Runnable{
    private Random random=null;
    private boolean leap=true;

    public void setLeap(boolean leap) {
        this.leap = leap;
    }

    @Override
    public void run() {
        //这里其实也可以直接调用Math.random()*100+1  更方便
        random=new Random();
        while (leap){
            try {
                int r = random.nextInt(101);
                System.out.println(r);
                java.lang.Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
        }
        System.out.println("T2线程结束");
    }
}

🎏练习二

🧨题述:

🎄有两个用户分别从同一张卡上取钱(总额10000),每次都取1000,当余额不足时,就不能取款了,并且不能出现超取现象

🧨代码演示

import java.util.Random;
import java.util.Scanner;

public class Thread {
    public static void main(String[] args) throws InterruptedException {

        TotalMoney totalMoney = new TotalMoney();
        java.lang.Thread user1 = new java.lang.Thread(totalMoney);
        java.lang.Thread user2=new java.lang.Thread(totalMoney);
        user1.setName("张三");
        user2.setName("李四");
        user1.start();
        user2.start();
    }
}
class TotalMoney implements Runnable{
    private int money=10000;

    @Override
    public void run() {

           while (true){
               synchronized (this){
                   if (money<1000){
                       System.out.println("余额不足,请存钱");
                       break;
                   }
                   money-=1000;
                   System.out.println(java.lang.Thread.currentThread().getName()+"取走1000  卡内还剩"+money);
               }
                   try {
                       java.lang.Thread.sleep(1000);
                   } catch (InterruptedException e) {
                       throw new RuntimeException(e);
                   }
           }
    }
}

👀👀解读重点代码👀👀

 synchronized (this){
                   if (money<1000){
                       System.out.println("余额不足,请存钱");
                       break;
                   }
                   money-=1000;
                   System.out.println(java.lang.Thread.currentThread().getName()+"取走1000  卡内还剩"+money);
               }

  • 这里使用synchronized 实现了线程同步

  • 当多个线程执行到这里时,就回去争夺this对象锁

  • 哪个线程争夺到了(this)对象锁,就回去执行synchronized 里面的代码,执行完后,会释放this对象锁

  • 争夺不到this对象锁 就blocked 继续准备争夺

  • 这里的非静态方法里面的this对象锁时非公平锁


	😘😘😘
    以上就是本篇博文的所有内容了,量不多
    ,但是都是实实在在的硬核知识,
    若果觉得对你有帮助的话,就支持支持博主吧!
    您的点赞就是俺出优质博文的动力
    👍👍👍
    🏆🏆🏆
    💪💪💪
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C_x_330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值