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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 沈子豪 中级黑马   /  2013-3-11 22:54  /  2103 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class PlayFootball implements Runnable
{
private int num=0;
Object obj=new Object();
public void run()
        {
        while (true)
      {
                 synchronized(obj)
                 {
                 if(num<10)
                 {
                 try{Thread.sleep(10);}catch(Exception e){}
         System.out.println(Thread.currentThread().getName()+"进球了");
                 num++;
                 }
                 }
      }
    }
}
class PlayFootballDemo
{
        public static void main(String[] args)
        {
          PlayFootball t=new PlayFootball();
          Thread t1=new Thread(t);
          Thread t2=new Thread(t);
          Thread t3=new Thread(t);
          Thread t4=new Thread(t);
          Thread t5=new Thread(t);
          t1.setName("C罗");
          t2.setName("梅西");
          t3.setName("罗纳尔多");
          t4.setName("贝克汉姆");
          t5.setName("齐达内");
          t1.start();
          t2.start();
          t3.start();
          t4.start();
          t5.start();
        }
}
以上是多线程,为什么一直输出的都是C罗进球了?这是一个死循环,为什么窗口只有十行?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 c罗厉害呗

查看全部评分

3 个回复

倒序浏览
因为你的cpu很快啊。你的是i3?i5还是i7?或者你用的是双核?而且你没有设置优先级,所以他们几个的优先级都是一样的,你试着把小贝的优先级写成10,看看是不是还是C罗?或者把梅西和C罗那两行代码调换位置,看看是不是还是C罗,或者在线程体里边家上一个条件限制,让线程sleep一段时间,你看看结果有什么不同。你的num定义的是10,循环到10 就stop,当然输出10行了,怎么能叫死循环呢?希望能对你有所帮助。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
你有个括号貌似弄错了,你把 System.out.println(Thread.currentThread().getName()+"进球了"); num++;这两句放在了if语句的大括号里,这样C罗线程首先开启,首先抢到CPU运行权,运行十次,num<10就不成立了,把那两句放到if括号外,我尝试过了,可以运行的~

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
PlayFootball t=new PlayFootball();
          Thread t1=new Thread(t);
          Thread t2=new Thread(t);
          Thread t3=new Thread(t);
          Thread t4=new Thread(t);
          Thread t5=new Thread(t);
          t1.setName("C罗");
          t2.setName("梅西");
          t3.setName("罗纳尔多");
          t4.setName("贝克汉姆");
          t5.setName("齐达内");

看这段代码  你在创建线程的时候 传入的都是同一个对象t  
而在类PlayFootball  使用了synchronized(obj) 同步代码块  所以当第一个线程即t1启动的时候获得了obj这个同步锁   下面的几个线程便无法进入这段代码块  而 在你的程序中使用while(true) 所以无法退出该代码块 故永远只会打印第一个线程 即t1中的信息  这就是为什么只会打印“C罗进球了” 如果你改为先运行第二个 即t2.start  那么就会只打印“梅西进球了”
另外为什么只打印10行呢 原因如下
这几个线程共用同一个对象t中的变量num    根据你代码来看   只要num=10后 便不会再打印 信息了 也就是说只要几个线程加起来打印了10行
如果要得到交替打印  每个人进10个球的话可以使用如下代码
class PlayFootball implements Runnable {
        private int num = 0;

        public void run() {
                while (true) {
                                if (num < 10) {
                                        try {
                                                Thread.sleep(1000);
                                        } catch (Exception e) {
                                        }
                                        System.out.println(Thread.currentThread().getName() + "进球了");
                                        num++;
                        }
                }
        }
}

public class PlayFootballDemo {
        public static void main(String[] args) {
        PlayFootball t1=new PlayFootball();
        PlayFootball t2=new PlayFootball();
        PlayFootball t3=new PlayFootball();
        PlayFootball t4=new PlayFootball();
        PlayFootball t5=new PlayFootball();
        Thread th1=new Thread(t1);
        Thread th2=new Thread(t2);
        Thread th3=new Thread(t3);
        Thread th4=new Thread(t4);
        Thread th5=new Thread(t5);
        th1.setName("C罗");
        th2.setName("梅西");
        th3.setName("罗纳尔多");
        th4.setName("贝克汉姆");
        th5.setName("齐达内");
        th1.start();
        th2.start();
        th3.start();
        th4.start();
        th5.start();
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马