题目:构建四个线程,线程A将变量100加1,B减1,c加1,D减1,要按照A->B->C->D的顺序执行,最终数字还为100.使用多线程
代码:
PrintLetter.java
import java.lang.Thread;
class MyThread implements Runnable{
//给线程分配三个对象
private Object pre;
private Object self;
private Num num;
public MyThread(Object pre,Object self,Num num){
this.pre=pre;
this.self=self;
this.num=num;
} public void run(){
for(int i=0;
i<10;
i++){
synchronized(pre){
synchronized(self){
synchronized(num){
self.done(num,Thread.currentThread().getName());
self.notify();
//唤醒其他线程释放对象锁
}
}
//否则或者运行完成后释放前一个对象锁
try{
pre.wait();
}catch(Exception e){
e.printStackTrace();
}
}
}
}
}
//数字对象
class Num{
public int num=100;
public void add(){
this.num++;
}
public void resuce(){
this.num--;
}
public int get(){
return this.num;
}
}class Object{
boolean done;
//表示加或减
public Object(boolean done){
this.done=done;
}
public void done(Num num,String name){
if(this.done){
num.add();
System.out.println(""+name+" add---- one,Then num="+num.get());
}else{
num.resuce();
System.out.println(""+name+" reduce one,Then num="+num.get());
}
}
}public class PrintLetter{
public static void main(String args[]){
//定义四个对象
Object first=new Object(true);
Object two=new Object(false);
Object three=new Object(true);
Object four=new Object(false);
Num num=new Num();
MyThread mythread1=new MyThread(four,first,num);
MyThread mythread2=new MyThread(first,two,num);
MyThread mythread3=new MyThread(two,three,num);
MyThread mythread4=new MyThread(three,four,num);
new Thread(mythread1).start();
try{
Thread.sleep(100);
}catch(Exception e){}
new Thread(mythread2).start();
try{
Thread.sleep(100);
}catch(Exception e){}
new Thread(mythread3).start();
try{
Thread.sleep(100);
}catch(Exception e){}
new Thread(mythread4).start();
try{
Thread.sleep(100);
}catch(Exception e){}
}
}
结果:
文章图片
过程解析:
【线程笔记一(java线程经典题目:轮流打印)】
/*
四把锁 a b c d
线程1临界区要获得锁d a
线程2临界区要获得锁a b
线程3临界区要获得锁b c
线程4临界区要获得锁c d 执行线程1的时 由于线程1 获得了锁a,所以线程2会等待线程1释放锁a,线程2得到锁b
线程3会等待线程2是否锁b,线程4等待锁c和d. 线程1执行完临界区后,调用a.notify,释放自身锁,此时线程2被唤醒,开始执行,连锁反应
线程3线程4会的到顺序执行。 此外线程1调用d.wait等待其他线程唤醒,当执行完线程4的时候
调用d.notify 又会唤醒线程1. 此过程反复,直到所有线程执行完毕。线程1 2 3 4会得到顺序执行 执行1唤醒2执行2唤醒3执行3唤醒4执行4唤醒1:
1-------------->2-------->3------------>4
^|
|---------------------------------------|*/
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)