关于JAVA进程的同步问题 代码如下 为什么运行后只有一个线程工作?

classTicketSystem{publicstaticvoidmain(String[]args){SellThreadst=newSellThread();new... class TicketSystem
{
public static void main(String[] args)
{
SellThread st = new SellThread();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
new Thread(st).start();
}
}

class SellThread implements Runnable
{
int tickets=100;
Object obj = new Object();
public void run()
{
while(true)
{
synchronized(obj)
{
if(tickets>0)
{

System.out.println(Thread.currentThread().getName()+ "sell tickets"+tickets);
tickets--;
}
}
}
}
}
那怎么才能释放CPU资源呢? 而且我的程序的确不会自己结束?为什么啊? 应该到0了就结束的啊?
展开
 我来答
wjzmr123
2012-03-04
知道答主
回答量:5
采纳率:0%
帮助的人:5.9万
展开全部
麻烦楼上的哥哥们不要误人子弟了,不能结束的原因是你的线程里没有跳出while(true)的语句也就是没有进程的结束处理,应该if后边else{break;},而为什么都是一个线程调用的就是CPU分配时间片的问题了,在代码里加上sleep()处理下结果就明显了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
15159914190
2011-01-31 · TA获得超过207个赞
知道答主
回答量:72
采纳率:0%
帮助的人:50.7万
展开全部
首先可以肯定的是当在run()中声明并创建是,那么新创建的对象就相当于run()的局部变量了,每个线程都会新建一个所以两个线程输出的num的值是相等的,但是为什么有时输出2我就不知道了,按上面说的应该是每次都是从0...[详细]
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
yeafee
2011-01-31 · TA获得超过134个赞
知道小有建树答主
回答量:148
采纳率:0%
帮助的人:75.8万
展开全部
这个应该是你的结果吧。
public class hello {
public static void main(String[] args) {
Thread t1 = new Thread(new SellThread(), "1");
t1.start();
Thread t2 = new Thread(new SellThread(), "2");
t2.start();
Thread t3 = new Thread(new SellThread(), "3");
t3.start();
Thread t4 = new Thread(new SellThread(), "4");
t4.start();

}
}

class SellThread implements Runnable {
int tickets = 100;
Object obj = new Object();
public void run() {
boolean flag = true;
while (flag) {
synchronized (obj) {
if (tickets > 0) {

System.out.println(
Thread.currentThread().getName()
+ "sell tickets"
+ tickets);
tickets--;
} else {
flag = false;
}
}
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
feverGreen
2011-01-31 · 超过30用户采纳过TA的回答
知道答主
回答量:106
采纳率:0%
帮助的人:69.6万
展开全部
while(true)
{

if(tickets>0)
{

System.out.println(Thread.currentThread().getName()+ "sell tickets"+tickets);
synchronized(obj) //把 synchronized(obj)对象锁的范围调小,改完后结果是这样
{
tickets--;
}
} else{
break; //这里,退出循环,程序就结束了。
}

}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Salever
2011-01-31 · TA获得超过240个赞
知道小有建树答主
回答量:537
采纳率:100%
帮助的人:412万
展开全部
你这里的代码
while(true)
{
synchronized(obj)
{
if(tickets>0)
{

System.out.println(Thread.currentThread().getName()+ "sell tickets"+tickets);
tickets--;
}
}
}

不会释放CPU资源,当然得等到这个线程执行完了才执行下一个了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式