黑马程序员技术交流社区
标题:
一个初级线程的问题,望高手解决一下
[打印本页]
作者:
张龙欢
时间:
2013-5-23 22:50
标题:
一个初级线程的问题,望高手解决一下
本帖最后由 张龙欢 于 2013-5-24 20:35 编辑
一个初级线程的问题,望高手解决一下-_#
一般来说对于下面的这段代码:
class TicketSystem
{
public static void main(String[] args)
{
SellTicket st = new SellTicket();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
}
}
class SellTicket implements Runnable
{
int tickets = 100;
public void run()
{
while(true)
{
if(tickets > 0)
{
System.out.println(Thread.currentThread().getName() + " sell ticket: " + tickets);
tickets--;
}
}
}
}
出来的结果应该是:
Thread-0 sell ticket: 100
Thread-0 sell ticket: 99
Thread-3 sell ticket: 98
...
Thread-1 sell ticket: 1
但是我这里出来的结果却是:
Thread-0 sell ticket: 10
Thread-0 sell ticket: 99
Thread-3 sell ticket: 99
Thread-3 sell ticket: 98
Thread-2 sell ticket: 99
Thread-2 sell ticket: 96
Thread-2 sell ticket: 95
...
Thread-1 sell ticket: 7
Thread-3 sell ticket: 8
Thread-0 sell ticket: 5
Thread-0 sell ticket: 4
Thread-0 sell ticket: 3
Thread-2 sell ticket: 6
Thread-1 sell ticket: 1
Thread-3 sell ticket: 2
看了老师人家的代码和我的一样,可是我的这个结果。。。
迷茫了半天了,请各位帮个忙吧。谢谢了!
对了,我这里用的是SUN公司的JDK 1.6.0_02。
作者:
谢孔营
时间:
2013-5-23 23:07
稍微解释一下
本程序涉及多线程,线程安全性问题。因为有共享资源票,四个线程,run方法有多条语句
所以存在线程安全问题,要想从100至一输出,必须加上同步代码块,或者同步函数
简单解决一下吧,
public void run()
{
while(true)
{
synchronized(Object.class){
if(tickets > 0)
{
System.out.println(Thread.currentThread().getName() + " sell ticket: " + tickets);
tickets--;
}
}
作者:
Sofoul
时间:
2013-5-23 23:24
本帖最后由 Sofoul 于 2013-5-23 23:25 编辑
package thread;
public class TicketDemo implements Runnable{
private int ticket=100;
public void run(){
while(true){
if(ticket>0)
System.out.println(Thread.currentThread().getName()+"正在售出的是第"+(ticket--)+"张票");
}
}
}
package thread;
public class TicketDemoTest {
/**
* @param args
*/
public static void main(String[] args) {
TicketDemo t=new TicketDemo();
Thread s=new Thread(t,"窗口1");
Thread s1=new Thread(t,"窗口2");
Thread s2=new Thread(t,"窗口3");
s.start();
s1.start();
s2.start();
}
}
作者:
陈潜
时间:
2013-5-24 01:12
首先说你程序的一个问题,,while(true)没有跳出
然后是多线程的安全问题:
public void run() {
boolean flag = true;//定义结束标签
while (flag) {
synchronized (Object.class) {//线程安全
if (tickets > 0) {
System.out.println(Thread.currentThread().getName()
+ " sell ticket: " + tickets);
tickets--;
}else{
flag = false;
}
try {
Thread.sleep((int) (Math.random()*1000));//随机的睡眠一会
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
复制代码
作者:
袁梦希
时间:
2013-5-24 01:27
楼主你好,如果问题以解决,请修改分类,谢谢合作。
\
作者:
吕振中
时间:
2013-5-24 09:48
这个结果正常
作者:
杨彬
时间:
2013-5-24 12:25
加锁啊 兄弟
作者:
张俊生
时间:
2013-5-24 13:57
用lock锁就行了,或者同步
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2