黑马程序员技术交流社区
标题:
【已解决】多线程的问题-求解
[打印本页]
作者:
张吉日
时间:
2012-8-10 13:26
标题:
【已解决】多线程的问题-求解
本帖最后由 张吉日 于 2012-8-10 14:30 编辑
/*
为什么我运行这个代码,在cmd上面出现的都是单线程Thread-0的从100-1,为什么不能实现多线程输出
*/
class Ticket implements Runnable //实现接口
{
private int tick = 100;
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();
}
}
作者:
周世阳
时间:
2012-8-10 13:35
能实现多线程输出,只不过多数情况只能看到一个线程,我试了10次才看到一次是Thread-1和Thread-4
这是因为你把
try{Thread.sleep(10);}catch(Exception e){}
放进了锁中,所以当线程运行到sleep(10)的时候,休息10毫秒,可是他还在同步代码块中,锁也还在这个线程上,这时候CPU的执行权虽然交到了其他线程里,但其他线程没有锁,无法进入同步代码快,之前的进程醒来会继续执行,如此下去就很难看到多线程执行,而是基本上一个线程完成的
将try{Thread.sleep(10);}catch(Exception e){}放入到while中的synchronized(obj){}之前,就可以看到多线程输出了
作者:
戎石锁
时间:
2012-8-10 13:38
/*
首先恭喜你 你这个代码没有问题
只是票数有点少
*/
class Ticket implements Runnable //实现接口
{
private int tick = 100;
//这里可以改成400或者更多就可以了
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();
}
}
作者:
张吉日
时间:
2012-8-10 13:45
周世阳 发表于 2012-8-10 13:35
能实现多线程输出,只不过多数情况只能看到一个线程,我试了10次才看到一次是Thread-1和Thread-4
这是因为 ...
还没学到锁啊~ 迷糊
作者:
张吉日
时间:
2012-8-10 13:48
周世阳 发表于 2012-8-10 13:35
能实现多线程输出,只不过多数情况只能看到一个线程,我试了10次才看到一次是Thread-1和Thread-4
这是因为 ...
谢谢你 换了位置之后编程多线程了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2