为了账号安全,请及时绑定邮箱和手机立即绑定

这个runnable为何只进行一个线程?

这个runnable为何只进行一个线程?

冷魇 2017-02-03 21:07:49
public class Runnable01 implements Runnable{ private int ticketsCont=50;    private  Lock lock=new ReentrantLock();     public Runnable01() { // TODO Auto-generated constructor stub            } public void run(){    while(true){ lock.lock(); if (ticketsCont>0) {       ticketsCont--;     System.out.println(Thread.currentThread().getName()+"卖了1张,剩余为:"+ticketsCont); } lock.unlock(); if (ticketsCont==0) { break; }     }    }        public static void main(String[] args) throws InterruptedException { Runnable01 mt=new Runnable01(); Thread th1=new Thread(mt,"窗口1"); Thread th2=new Thread(mt,"窗口2"); Thread th3=new Thread(mt,"窗口3"); th1.start(); th2.start(); th3.start(); }}重复了几次,都是产生这种结果,不应该是1,2,3窗口都有么?:窗口1卖了1张,剩余为:49窗口1卖了1张,剩余为:48窗口1卖了1张,剩余为:47窗口1卖了1张,剩余为:46窗口1卖了1张,剩余为:45窗口1卖了1张,剩余为:44窗口1卖了1张,剩余为:43窗口1卖了1张,剩余为:42窗口1卖了1张,剩余为:41窗口1卖了1张,剩余为:40窗口1卖了1张,剩余为:39窗口1卖了1张,剩余为:38窗口1卖了1张,剩余为:37窗口1卖了1张,剩余为:36窗口1卖了1张,剩余为:35窗口1卖了1张,剩余为:34窗口1卖了1张,剩余为:33窗口1卖了1张,剩余为:32窗口1卖了1张,剩余为:31窗口1卖了1张,剩余为:30窗口1卖了1张,剩余为:29窗口1卖了1张,剩余为:28窗口1卖了1张,剩余为:27窗口1卖了1张,剩余为:26窗口1卖了1张,剩余为:25窗口1卖了1张,剩余为:24窗口1卖了1张,剩余为:23窗口1卖了1张,剩余为:22窗口1卖了1张,剩余为:21窗口1卖了1张,剩余为:20窗口1卖了1张,剩余为:19窗口1卖了1张,剩余为:18窗口1卖了1张,剩余为:17窗口1卖了1张,剩余为:16窗口1卖了1张,剩余为:15窗口1卖了1张,剩余为:14窗口1卖了1张,剩余为:13窗口1卖了1张,剩余为:12窗口1卖了1张,剩余为:11窗口1卖了1张,剩余为:10窗口1卖了1张,剩余为:9窗口1卖了1张,剩余为:8窗口1卖了1张,剩余为:7窗口1卖了1张,剩余为:6窗口1卖了1张,剩余为:5窗口1卖了1张,剩余为:4窗口1卖了1张,剩余为:3窗口1卖了1张,剩余为:2窗口1卖了1张,剩余为:1窗口1卖了1张,剩余为:0
查看完整描述

3 回答

已采纳
?
按照自己的节奏前行

TA贡献90条经验 获得超70个赞

public class Runnable01 implements Runnable{

private int ticketsCont=50;
    private  Lock lock=new ReentrantLock();
    public Runnable01() {
// TODO Auto-generated constructor stub
       
    }
public void run(){
   
while(true){
lock.lock();
if (ticketsCont>0) {	 
     ticketsCont--;
     System.out.println(Thread.currentThread().getName()+"卖了1张,剩余为:"+ticketsCont);
}
lock.unlock();
//一般在这里加个暂停时间,给其他线程让步下就好了,看这里看这里看这里!!!------
try {
		Thread.sleep(1000);
	} catch (InterruptedException e) {
	e.printStackTrace();
	}
if (ticketsCont==0) {
break;
}
    }
    }
    
    public static void main(String[] args) throws InterruptedException {
Runnable01 mt=new Runnable01();
Thread th1=new Thread(mt,"窗口1");
Thread th2=new Thread(mt,"窗口2");
Thread th3=new Thread(mt,"窗口3");
th1.start();
th2.start();
th3.start();
}
}


查看完整回答
2 反对 回复 2017-02-04
?
慕粉1529473653

TA贡献8条经验 获得超2个赞

你是让窗口一的线程先开始,所以也就执行线程一,因为计算机处理很快,所以当处理完线程一的if (ticketsCont>0)语句后解锁然后又进入下一个循环了。

要知道计算机是从上往下处理的。

正解就是在解锁后加入一段时间的休眠了。如云naive所示。

查看完整回答
1 反对 回复 2017-02-04
  • 3 回答
  • 0 关注
  • 1304 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信