黑马程序员技术交流社区
标题:
执行结果怎么有4次 1到100 而不是1次
[打印本页]
作者:
请备注
时间:
2014-4-3 16:38
标题:
执行结果怎么有4次 1到100 而不是1次
class Ticket extends Thread
{
private int tick = 100;
public void run()
{
while(true)
{
if(tick>0)
{
System.out.println(currentThread().getName()+"sale: "+
tick--);
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
作者:
xietansheng
时间:
2014-4-3 16:51
本帖最后由 xietansheng 于 2014-4-3 17:05 编辑
你创建了四条没有共享数据独立线程,你这个卖票程序很多问题,比如同一数据源,线程安全问题等都没考虑,还出现死循环问题,票卖完了也不会退出循环。
在你的程序框架基础上进行了修改,如下:
class Ticket extends Thread
{
private static int tick = 100; // 保证同一数据源
public void run()
{
while(true)
{
synchronized(Ticket.class) // 加同步锁,保证线程安全
{
if(tick > 0)
{
System.out.println(currentThread().getName() + " sale: " + tick--);
}
else
{
break; // 票卖完了,需要退出循环
}
}
try
{
Thread.sleep(100); // 需要稍作休息,否则看不出效果
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
Ticket t3 = new Ticket();
Ticket t4 = new Ticket();
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
作者:
papercup
时间:
2014-4-3 16:55
因为每个线程start后,都会调用run方法,于是,就会每个线程都卖100张票。
于是就要加入同步代码块:
class Ticket implements Runnable
{
private int tick = 1000;
Object obj = new Object();
public void run()
{
while(true)
{
synchronized(obj)
{
if(tick>0)
{
//try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"....sale : "+ tick--);
}
}
}
}
}
class TicketDemo2
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2