黑马程序员技术交流社区
标题:
多线程卖票不明白的地方2
[打印本页]
作者:
ぺsimon☆
时间:
2013-5-15 17:07
标题:
多线程卖票不明白的地方2
本帖最后由 ぺsimon☆ 于 2013-5-16 00:06 编辑
/*
有100张票,4个窗口在同时卖票,用多线程实现
*/
class Ticket implements Runnable
{
//定义100张票
private static int ticket=100;
boolean flag=true;
//覆盖run方法
public void run()
{
synchronized(this)
{
while(flag==true && ticket>0)
{
try{Thread.sleep(10);}catch(Exception e){e.toString();}
System.out.println(Thread.currentThread().getName()+"....."+ticket--);
}
}
//调用show方法
show();
}
public synchronized void show()
{
while(flag==false && ticket>0)
{
try{Thread.sleep(10);}catch(Exception e){e.toString();}
System.out.println(Thread.currentThread().getName()+"------"+ticket--);
}
}
}
class TicketDemo
{
public static void main(String[] args)
{
Ticket t=new Ticket();
Thread t1=new Thread(t);
t1.start();
//让主线程睡一会
try{Thread.sleep(10);}catch(Exception e){}
t.flag=false;
Thread t2=new Thread(t);
t2.start();
}
}
复制代码
不知道为什么,从头到尾都是0线程在运行,1线程没有运行?谢谢
作者:
李志敏
时间:
2013-5-15 19:42
锁应该在while里面的吧
class Ticket implements Runnable
{
private int tick = 100;
Object obj = new Object();
boolean flag = true;
public void run() {
if (flag) {
while (true) {
synchronized (obj) {
if (tick > 0) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "....code : "
+ tick--);
}
}
}
} else
while (true)
show();
}
public synchronized void show()
{
if (tick > 0) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "....show.... : " + tick--);
}
}
}
public class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
try {
Thread.sleep(10);
} catch (Exception e) {
}
t.flag = false;
t2.start();
}
}
复制代码
作者:
刘学明
时间:
2013-5-15 23:27
本帖最后由 刘学明 于 2013-5-15 23:29 编辑
class Ticket implements Runnable
{
private int tick = 100;
Object obj = new Object();
boolean flag = true;
public void run() {
if (flag) {
while (true) {
synchronized (obj) { //把锁定义在While循环的里面 因为如果定义在While外面 当Thread0进入同步锁以后然后就是一直是Thread0进行无限循环 直到把票卖完,Thread1也永远进不来。
if (tick > 0) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "....code : " + tick--);
}
}
}
} else
while (true)
show();
}
public synchronized void show()
{
if (tick > 0) {
try {
Thread.sleep(10);
} catch (Exception e) {
}
System.out.println(Thread.currentThread().getName() + "....show.... : " + tick--);
}
}
}
public class TicketDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
try {
Thread.sleep(10);
} catch (Exception e) {
}
t.flag = false;
t2.start();
}
}
复制代码
作者:
ぺsimon☆
时间:
2013-5-16 00:06
谢谢,大家原来是把锁定义在while循环外面了,呵呵,明白 了
作者:
librazeng
时间:
2013-5-16 00:12
本帖最后由 librazeng 于 2013-5-16 00:16 编辑
不知道为什么,从头到尾都是0线程在运行,1线程没有运行?谢谢
答:如刘学明所言,要把同步代码块定义在while(true){}循环里面。你的代码问题出在:
synchronized(this)
{
while(flag==true && ticket>0)
{
try{Thread.sleep(10);}catch(Exception e){e.toString();}
System.out.println(Thread.currentThread().getName()+"....."+ticket--);
}
}
线程0拿到锁进来以后,一直在上面这个同步代码快中循环,直到ticket=0,也就是卖光了,ticket>0结果为false时,才跳出while循环,释放锁。主线程将flag改为false后,线程1过来调用show()方法,判断while(flag==false&&ticket>0)时,第二个表达式结果为false,所以不会进入循环,输出结果。
给我技术分啊啊啊啊啊{:soso_e109:}{:soso_e118:}
作者:
ぺsimon☆
时间:
2013-5-16 00:18
librazeng 发表于 2013-5-16 00:12
不知道为什么,从头到尾都是0线程在运行,1线程没有运行?谢谢
答:如刘学明所言,要把同步代码块定义在while ...
哦,谢谢哥们啦,呵呵慢慢来面包还是会有的
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2