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

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


冷魇
浏览 1255回答 3
3回答

按照自己的节奏前行

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(); } }

慕粉1529473653

你是让窗口一的线程先开始,所以也就执行线程一,因为计算机处理很快,所以当处理完线程一的if (ticketsCont>0)语句后解锁然后又进入下一个循环了。要知道计算机是从上往下处理的。正解就是在解锁后加入一段时间的休眠了。如云naive所示。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java