博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(转载)java线程 - 线程唤醒后并被执行时,是在上次阻塞的代码行重新往下执行,而不是从头开始执行...
阅读量:4313 次
发布时间:2019-06-06

本文共 1344 字,大约阅读时间需要 4 分钟。

今天重新把昨晚的线程同步面试题做一遍时,发现实际情况运行下来时,线程一直不同步。后来经过不断测试,发现自己的一个误区。

之前一直以为,线程如果被唤醒后再次执行时,会从头开始运行这个线程,也就是重新运行Runnable中的run()方法;

而实际情况是,被唤醒并且被执行的线程是从上次阻塞的位置从下开始运行,也就是从wait()方法后开始执行。

所以判断是否进入某一线程的条件 是用while判断,而不是用If判断判断。

下面举例说明:

如果三个线程同步工作,第一个线程打印1,2,3,4,5   ,然后第二个线程打印1,2,3,4,5  ,接着第三个线程也打印 1,2,3,4,5,重复100次。

public class Thread_test {

static final manage m = new manage();
public static void main(String[] args) {
//线程一
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for(int i=0;i<50;i++){
m.threadPrint(i,0);
}
}
}).start();
//线程二
new Thread(new Runnable(){
public void run(){
for(int i=0;i<50;i++){
m.threadPrint(i,1);
}
}
}).start();
//线程三
new Thread(new Runnable(){
public void run(){
for(int i=0;i<50;i++){
m.threadPrint(i,2);
}
}
}).start();

}

}

//控制线程执行的顺序
class manage{
//权限,0代表1号线程执行,1代表二号线程执行,2代表三号线程执行
private int isA = 0;
public synchronized void threadPrint(int i,int n){
/*该处应用while来判断是否轮到该线程执行,假如用If判断的话,如果该线程阻塞后再次被唤醒执行时(其他线程调用this.notifyAll()),
他会从this.wait()后面的代码开始执行,即时没轮到该线程执行*/
while(this.isA != n){
try {
this.wait();
} catch (Exception e) {
// TODO: handle exception
}
}
for(int j=0;j<5;j++){
System.out.println(Thread.currentThread().getName()+":"+(j+1)+" loop in "+(i+1));
}
this.isA = (this.isA+1)%3;//将权限传递给后一个进程62 this.notifyAll();
}
}

转载于:https://www.cnblogs.com/ggds/p/8602016.html

你可能感兴趣的文章
我与小娜(02):乘坐超速高铁,穿越时空60年
查看>>
H5取经之路——添加hover实现特定效果
查看>>
ultraiso:usb-hdd+ v2
查看>>
WINDOWS symbols
查看>>
SQL Server 2008 镜像的监控 - Joe.TJ -
查看>>
SQL Server DBA 文章:116篇 --DBA_Huangzj
查看>>
数据库Mysql性能优化
查看>>
程序猿是如何解决SQLServer占CPU100%的--马非码
查看>>
Shell之sed用法 转滴
查看>>
百度ueditor 拖文件或world 里面复制粘贴图片到编辑中 上传到第三方问题
查看>>
python基础之函数参数、嵌套、返回值、对象、命名空间和作用域
查看>>
公式推导【ASRCF//CVPR2019】
查看>>
Python(4)_Python中的数据类型
查看>>
HTTP 响应头信息
查看>>
cocos2dx中的层CCLayer
查看>>
Windows XP硬盘安装Ubuntu 12.04双系统图文详解
查看>>
【资料】哈代&拉马努金相关,悼文,哈佛演讲,及各种杂七杂八资料整理
查看>>
Use weechat (IRC client) on OS X. MacBook Pro
查看>>
Luogu P3616 富金森林公园
查看>>
[Nowcoder] 六一儿童节(拼多多)
查看>>