格局
😎大家好💪,我是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对象锁时非公平锁
😘😘😘
以上就是本篇博文的所有内容了,量不多
,但是都是实实在在的硬核知识,
若果觉得对你有帮助的话,就支持支持博主吧!
您的点赞就是俺出优质博文的动力
👍👍👍
🏆🏆🏆
💪💪💪