黑马程序员技术交流社区
标题:
多线程的问题
[打印本页]
作者:
张智文
时间:
2013-8-9 14:09
标题:
多线程的问题
本帖最后由 lilylikejack 于 2013-8-9 17:14 编辑
class Ticket implements Runnable
{
private int tick =40;
public void run()
{
while(true)
{
if(tick>0)
{
System.out.println(Thread.currentThread().getName()+"...sale:"+tick--);
}
}
}
}
class TicketDemo
{
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();
}
}
复制代码
听的感觉差不多,自己敲了一遍代码 我想在票卖完的时候加一句打印一句“票已售完”该加在哪里。。自己常识加了几次都失败了
作者:
薛淑凯
时间:
2013-8-9 14:45
循环加一个结束标记,然后在主线程中等待四个线程终止,即join方法,然后打印语句。暂时只能想到这个方法了,有什么好想法通知一声啊。谢了
作者:
xkfxm
时间:
2013-8-9 14:54
class Ticket implements Runnable
{
private int tick = 100; //堆内存中
Object obj = new Object();
// public (synchronized) void run()(也可以把synchronized放函数上做为修饰符)
public void run()
{
while(true)
{
synchronized (obj)
{
if(tick>0)
{
try{Thread.sleep(50);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+"^^sale:"+tick--);
}
else
{
System.out.println("票已售完");
Thread.currentThread().stop();
}
}
}
}
}
class TicketDemo
{
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();
}
}
复制代码
代码如上,需要注意的是:
1、因为几个线程同时访问Ticket类对象t的一个成员变量tick,
所以要在重写run方法的时候当访问到此变量的代码要加上同步,避免数据出错;
2、四个线程同时买票,就等于四个窗口同时卖票,当地一个线程判断卖完了会打印“票已卖完”,然后此线程死掉,第二个线程又会执行这句,
所以就好像每个窗口都会提示票卖完了,会打印四句
希望可以帮到你
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2