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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chinese 中级黑马   /  2014-1-4 19:32  /  1167 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package xiancheng;

  2. class Shou implements Runnable{
  3.         int tick=1000;
  4.         Object a=new Object();
  5.         public void run(){
  6.                 while(tick>0){
  7.                         synchronized (a) {
  8.                                        
  9.                                         System.out.println(Thread.currentThread().getName()+"run"+tick--);
  10.                         }
  11.                 }
  12.         }
  13. }

  14. public class MaiPiao {


  15.         public static void main(String[] args) {
  16.                 // TODO Auto-generated method stub
  17.                 Shou t=new Shou();
  18.                 Thread t1=new Thread(t);
  19.                 Thread t2=new Thread(t);
  20.                 Thread t3=new Thread(t);
  21.                 Thread t4=new Thread(t);
  22.                 t1.start();
  23.                 t2.start();
  24.                 t3.start();
  25.                 t4.start();
  26.         }

  27. }
复制代码
为什么打印结果只有一个线程输出,最后别的线程才输出。如
Thread-0run1000;
Thread-0run999;
...
Thread-0run1;

Thread-1run0;
Thread-2run-1;

Thread-3run-3;





评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

3 个回复

倒序浏览
你的机器运行速度过快  你可以尝试使用sleep()方法或者将
int tick=1000;改为
int tick=100000;


~~!奋斗
回复 使用道具 举报
其实你说只出现Thread-0,是因为你的cpu执行速度太快的问题
因为cpu是随机给线程分配执行权的可以加上Thread.sleep()方法
至于出现负数的情况是因为当时4个线程已经都已经进入了run()方法,正在等待锁释放
第一个线程一执行结束,锁释放,剩下三个线程又会继续执行
所以也就出现了锁的问题
可以这样解决
try{
     Thread.sleep(1);
     if(tick>0)
         System.out.println(Thread.currentThread().getName()+"run"+tick--);
}catch(Exception e)
{
}                                       

问题解决

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
1这个随机的问题,每个电脑不一样
Thread-0一直占用,其他线程就没法进来,可以用Thread.sleep()延迟下
2出现0是因为
  while(tick>0){
         如果这里thread-2和thread-3,thread-1都先运行到这里,只有thread-1往下执行了
         当thread1执行到tick=0时,
         thread-2和thread-3在进入锁,就会出现负数
                        synchronized (a) {
                                       
                                        System.out.println(Thread.currentThread().getName()+"run"+tick--);
                        }
                }

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 很给力!

查看全部评分

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