黑马程序员技术交流社区
标题:
帮忙看下多线程中的问题
[打印本页]
作者:
杜成龙
时间:
2013-6-13 17:18
标题:
帮忙看下多线程中的问题
本帖最后由 孙百鑫 于 2013-6-20 19:17 编辑
class Single implements Runnable
{
int x=100;
private static Single s=null;
private Single()
{
while(true)
{
if(x>0)
System.out.println(Thread.currentThread().getName()+" 输出 "+x--);
}
}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if (s==null)
{
s=new Single();
}
}
}
return s;
}
public void run()
{
getInstance();
}
}
class SingleDemo
{
public static void main(String[] args)
{
Thread t1=new Thread(Single.getInstance());
Thread t2=new Thread(Single.getInstance());
t1.start();
t2.start();
}
}
复制代码
请问各位我这个多线程程序中为什么只输出主线程,而没有我创建的线程呢?按说运行run方法时是会输出我创建的线程的啊?
作者:
沐有鱼丸
时间:
2013-6-14 13:40
我想会不会是因为使用了单例模式,在第一次加载Single.getInstance()时候是主线程输出一百次,第二次调用Single.getInstance()的时候判断s!=null,不执行new Single();,而后面t1.start(),t2.start()的时候,run方法调用getInstance()时,s!=null,都不执行new Single(),程序就只输出了一百次main,不知道这样理解行不行
作者:
张承富
时间:
2013-6-14 17:19
个人感觉你这里用单例模式不太恰当,而且程序有问题,你执行后打印出的是Singe 构造函数里的程序
作者:
张承富
时间:
2013-6-14 17:24
public class Single implements Runnable
{
int x=10;
private static Single s=new Single();
private Single()
{
while(x>0)
{
Thread.currentThread().setName("1111");
System.out.println(Thread.currentThread().getName()+" 输出 "+x--);
}
}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if (s==null)
{
s=new Single();
}
}
}
return s;
}
public void run()
{
getInstance();
}
}
复制代码
设置下线程名就看到了
作者:
王磊
时间:
2013-6-16 03:03
应该是使用单例的原因。创建线程1对象时候,传入参数为Single.getInstance(),已经被主函数创建了Single对象,并运行构造函数主体。主体while判断条件为true,为无限循环。主体函数没有运行结束,主函数内后续代码都没有被执行,所以只运行主函数,线程没有创建成功。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2