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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜成龙 中级黑马   /  2013-6-13 17:18  /  1544 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙百鑫 于 2013-6-20 19:17 编辑
  1. class Single implements Runnable
  2. {
  3.      int x=100;
  4.      private static Single s=null;
  5.      private Single()
  6.     {
  7.         while(true)
  8.        {
  9.            if(x>0)

  10.            System.out.println(Thread.currentThread().getName()+" 输出 "+x--);
  11.        }
  12.     }
  13.     public static Single getInstance()
  14.    {
  15.        if(s==null)
  16.         {
  17.             synchronized(Single.class)
  18.               {
  19.                   if (s==null)
  20.                    {
  21.                       s=new Single();
  22.                    }
  23.               }
  24.         }
  25.      return s;
  26.   }
  27.    public void run()
  28. {
  29.     getInstance();
  30. }
  31. }

  32. class SingleDemo
  33. {
  34.     public static void main(String[] args)
  35.     {
  36.        Thread t1=new Thread(Single.getInstance());
  37.        Thread t2=new Thread(Single.getInstance());
  38.        t1.start();
  39.        t2.start();
  40.     }
  41. }
复制代码
请问各位我这个多线程程序中为什么只输出主线程,而没有我创建的线程呢?按说运行run方法时是会输出我创建的线程的啊?

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

4 个回复

倒序浏览
我想会不会是因为使用了单例模式,在第一次加载Single.getInstance()时候是主线程输出一百次,第二次调用Single.getInstance()的时候判断s!=null,不执行new Single();,而后面t1.start(),t2.start()的时候,run方法调用getInstance()时,s!=null,都不执行new Single(),程序就只输出了一百次main,不知道这样理解行不行

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
个人感觉你这里用单例模式不太恰当,而且程序有问题,你执行后打印出的是Singe 构造函数里的程序

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

回复 使用道具 举报
  1. public class Single implements Runnable
  2. {
  3.      int x=10;
  4.      private static Single s=new Single();
  5.      private Single()
  6.     {
  7.         while(x>0)
  8.        {
  9.            
  10.                         Thread.currentThread().setName("1111");
  11.            System.out.println(Thread.currentThread().getName()+" 输出 "+x--);
  12.                   
  13.        }
  14.     }
  15.     public static Single getInstance()
  16.    {
  17.        if(s==null)
  18.         {
  19.             synchronized(Single.class)
  20.               {
  21.                   if (s==null)
  22.                    {
  23.                       s=new Single();
  24.                    }
  25.               }
  26.         }
  27.      return s;
  28.   }
  29.    public void run()
  30. {
  31.     getInstance();
  32. }
  33. }
复制代码
设置下线程名就看到了
回复 使用道具 举报
应该是使用单例的原因。创建线程1对象时候,传入参数为Single.getInstance(),已经被主函数创建了Single对象,并运行构造函数主体。主体while判断条件为true,为无限循环。主体函数没有运行结束,主函数内后续代码都没有被执行,所以只运行主函数,线程没有创建成功。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1

查看全部评分

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