黑马程序员技术交流社区
标题: 多线程问题 [打印本页]
作者: 莫道荣 时间: 2013-3-4 22:49
标题: 多线程问题
本帖最后由 莫道荣 于 2013-3-5 22:31 编辑
这个程序 我的意图是想让三个线程一共卖100张票,但是每次运行的时候总是一个线程将100张票全部卖完。我已经在
run()方法中加入了Thread.sleep(1000);语句,感觉程序遇到这句时应该当前线程休眠,其他线程执行,不应该只有一
个线程执行呀?求高人指点?
您的任何帮助,我将不尽感激。
package com.cbd.zhixiang;
public class ThreadDemo
{
public static void main(String[] args)
{
Ticket t = new Ticket();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class Ticket implements Runnable
{
private int count = 100;
Object obj = new Object();
public void run()
{
synchronized (obj)
{
while (count > 0)
{
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "..."
+ count--);
}
}
}
}
作者: 唐长智 时间: 2013-3-4 23:05
修改下就能运行了- public class ThreadDemo{
- public static void main(String[] args){
- Ticket t = new Ticket();
- //创建对象并创建三个线程
- new Thread(t).start();
- new Thread(t).start();
- new Thread(t).start();
- }
- }
- class Ticket implements Runnable{
- private int count = 100;
- Object obj = new Object();
- public void run(){
- while (count > 0){
- try{
- Thread.sleep(1000);
- }
- catch(InterruptedException e){
- e.printStackTrace();
- }
- synchronized (obj){
- //同步代码块的位置应该放在这,因为如果你把sleep()方法也扩进去的话,线程是在同步的时候sleep()其他线程也没有办法抢到锁来运行,所以结果才会一个线程运行
- if(count > 0){
- //在这里加一层判断,防止出现负票
- System.out.println(Thread.currentThread().getName() + "..."+ count--);
- }
- }
- }
- }
- }
复制代码
作者: 陈圳 时间: 2013-3-4 23:07
class Test3
{
public static void main(String[] args)
{
Ticket t=new Ticket();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class Ticket implements Runnable
{
private int count=100;
Object obj = new Object();
public void run()
{
System.out.println("多线程启动!");
//synchronized (obj)//这一步,你的锁定义在这里,相当于定义在run方法上了,就完全是单线程了.
//{
while (count > 0)
{
try
{Thread.sleep(10);} //线程在这里停多了.到最后票要卖完了.那么线程,还是会再卖一票,程序也会出错,
catch (InterruptedException e)
{e.printStackTrace();}
synchronized(obj)
{
if(count>0)//加上一层判断,阻止票卖完了,还有沉睡的线程进来继续卖.
System.out.println(Thread.currentThread().getName()+"..."+count--);
}
}
//}
}
}
作者: 唐长智 时间: 2013-3-4 23:11
陈圳 发表于 2013-3-4 23:07
class Test3
{
public static void main(String[] args)
哈哈,我两基本说的一模一样
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |