A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© dengjiaqiang 中级黑马   /  2016-5-11 23:15  /  399 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

public class Sha implements Runnable{
private int a=1;
public void run(){
  for(int i=0;i<1000;i++){
   synchronized(this){
    a+=1;
    try{
     Thread.sleep(500);
    }catch(InterruptedException e){
     throw new RuntimeException(e);
    }
    a-=1;
    System.out.println(Thread.currentThread().getName()+":第一"+a);
   }
  }
}
public void go(){
  for(int i=0;i<1000;i++){
   System.out.println(Thread.currentThread().getName()+":第二"+i);
   Thread.yield();
  }
}
public static void main(String args[])throws InterruptedException{
  Sha sha=new Sha();
  Thread no=new Thread(sha);
  Thread no1=new Thread(sha);
  no.start();
  no1.start();
                sha.go();
}

}

上面这个程序运行的时候  大家都知道 主线程 sha.go()和这两个线程no.start();no1.start();
书上说的是no.start()线程启动  运行到Thread.sleep(500)时候   no.start()线程睡眠 ,放弃当前线程,而主线程sha.go();有机会获得cpu,进入运行状态
no1.strat()线程因为没有得到Sha的对象锁。
但是  我在运行中发现 主线程根本没获得运行权,倒是   no1.strat()获得啦线程权,而且还运行出结果啦;
请问下这个是什么问题?

评分

参与人数 1黑马币 +20 收起 理由
lvlup200 + 20 贱人

查看全部评分

2 个回复

倒序浏览
在no和no1线程开启前, 需要一点点时间, 但是在此之前, main线程就获得了cpu的执行权, 一瞬间将go()方法执行完毕, 此时no线程和no1线程开启了, 开始执行循环语句. 所以, main线程早就执行完了. 并不是没抢到执行权
回复 使用道具 举报
lvlup200 发表于 2016-5-11 23:23
在no和no1线程开启前, 需要一点点时间, 但是在此之前, main线程就获得了cpu的执行权, 一瞬间将go()方法执行 ...

6666666666666666666
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马