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();
}
}
}
}