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

之前一直以为,线程如果被唤醒后再次执行时,会从头开始运行这个线程,也就是重新运行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();

}

}

java重新执行_(转载)java线程 - 线程唤醒后并被执行时,是在上次阻塞的代码行重新往下执行,而不是从头开始执行...相关推荐

  1. java string()函数_转载java String.split()函数的用法详解

    转载java String.split()函数的用法详解 如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!在java.lang包中有String.split()方法的原型是: p ...

  2. java求约数_[转载]Java求最大公约数与最小公倍数

    (看到一份不错的总结,拿来收着) 如果数a能被数b整除,a就叫做b的倍数,b就叫做作a的约数.约数和倍数都表示一个数与另一个数的关系,不能单独存在.如只能说16是某数的倍数,2是某数的约数,而不能孤立 ...

  3. java生成水印_[转载]java操作word生成水印

    应用场景 为了保护版权或辨别文件的真伪,有时需要在生成的Word文件中动态添加水印,PageOffice组件的WaterMark类就封装了给在线编辑的Word文件添加水印这一功能,调用接口非常简单. ...

  4. java形状类_[转载]JAVA 设计一个形状类Shape 求周长和面积

    设计一个形状类Shape,方法:求周长和求面积 形状类的子类:Rect(矩形),Circle(圆形) Rect类的子类:Square(正方形) 不同的子类会有不同的计算周长和面积的方法 创建三个不同的 ...

  5. Java中进入wait状态的线程被唤醒后会接着上次执行的地方往下执行还是会重新执行临界区的代码

    Java中进入wait状态的线程被唤醒后会接着上次执行的地方往下执行还是会重新执行临界区的代码 用一个例子来说明: 例子原理 启动一个线程A打印数字,从0打印到9,在数字等于5的时候,进入wait状态 ...

  6. java消费者模式_基于Java 生产者消费者模式(详细分析)

    生产者消费者模式是多线程中最为常见的模式:生产者线程(一个或多个)生成面包放进篮子里(集合或数组),同时,消费者线程(一个或多个)从篮子里(集合或数组)取出面包消耗.虽然它们任务不同,但处理的资源是相 ...

  7. java三个线程 顺序执行_如何确保三个线程顺序执行

    三个线程t1.t2.t3.确保三个线程,t1执行完后t2执行,t2执行完后t3执行. 一.使用join thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程. ...

  8. java group类_浅析Java中线程组(ThreadGroup类)

    Java中使用ThreadGroup类来代表线程组,表示一组线程的集合,可以对一批线程和线程组进行管理.可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以有线程,这样的 ...

  9. java 多线程状态_总结Java中线程的状态及多线程的实现方式

    线程的状态线程状态图: 说明: 线程共包括以下5种状态. 1. 新建状态(New) : 线程对象被创建后,就进入了新建状态.例如,Thread thread = new Thread(). 2. 就绪 ...

最新文章

  1. tomcat server.xml
  2. 【Eclipse】 Eclipse 中JPEGEncodeParam 错误波浪线问题
  3. python3 多进程锁
  4. MySQL数据库事务的特性
  5. 前端学习(1390):多人管理项目10服务器认证
  6. 一文看懂Java虚拟机——JVM基础概念整理
  7. 微助教课件怎么下载_【微助教课件下载】[微助教]自测一下,您的课堂有好的开始和结束么?...
  8. python 交换机巡检脚本_Python自动巡检H3C交换机实现过程解析
  9. 精简ICO图标可减小EXE程序文件大小
  10. ORB-SLAM3论文解读
  11. 2015年高教社杯全国大学生数学建模A题太阳影子定位(Matlab代码)
  12. C# winform 中MessageBox用法大全(附效果图)
  13. 筋膜悬吊面部提升术后悔死了,几天消肿多久有效果
  14. subst ( 将任意目录挂载成虚拟磁碟机 )
  15. 手机网页端查看百度等搜索引擎网页快照的方法
  16. 自考需要免考的计算机和英语,请问自学考试英语2和计算机考试怎样办理免考。...
  17. 如何裁剪音频文件?裁剪音频的方法有什么?
  18. 微信开发者工具模拟器、IOS真机调试、Android真机调试中Editor效果不一致问题
  19. C语言共用体中,共用体变量的规律
  20. TutorialsPoint NumPy 教程(转)

热门文章

  1. linux默认开启sudo_Sudo漏洞允许非特权Linux和macOS用户以root身份运行命令
  2. excel对比_质量管理误区:SPC软件与微软Excel的应用对比
  3. linux文件系统pdf_一篇文章理解Ext4文件系统的目录
  4. ppt复制切片器_这6个新手必学的PPT技能,让你效率提升10倍!套模板都比别人快...
  5. php的反射技术,PHP 反射使用
  6. [BJDCTF 2nd]8086(异或脚本解题)
  7. Python 文件的详细操作
  8. 如何将字典值写入一个文本文件?
  9. python常用8大算法
  10. python argparse理解与实例