【多线程之abc顺序打印10次】package com.ghgj.cn.thread;
public class ThreadABC {
static Object abc = new Object();
static Boolean thread1=true;
static Boolean thread2=false;
static Boolean thread3=false;
static int i=0;
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;
i<10;
i++){//循环10次
synchronized (abc){//当前线程获取静态对象()
while(thread1==false){//条件分支,这里不能用if
try {
System.out.println("aa");
abc.wait();
//主动释放对象锁,同时本线程休眠
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("a");
thread1=false;
//保证本线程不死
thread2=true;
//唤醒2线程
thread3=false;
//保证3线程不死
abc.notifyAll();
}}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;
i<10;
i++){
synchronized (abc){
while(thread2==false){
try {
abc.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("b");
thread1=false;
thread3=true;
thread2=false;
abc.notifyAll();
}}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for(int i=0;
i<10;
i++){
synchronized (abc){
while(thread3==false){
try {
abc.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("c");
thread1=true;
thread2=false;
thread3=false;
abc.notifyAll();
}}
}
}).start();
}
}
在同一时间只有一个线程可访问该类的实例.
线程间相互唤醒的话就需要借助Object.wait(), Object.nofity()了。
Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制,而sleep不会,理解了这些解决这道面试题应该就不成问题了
参考自:https://blog.csdn.net/shinehuaking2011/article/details/8112432
推荐阅读
- 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组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)