java多线程卖票_java多线程的卖票问题

展开全部

首先,定义的锁(lock)不对,必须是同一e69da5e887aa62616964757a686964616f31333335313235个锁,像你这样用this,new多少个MyThread就有多少个锁,违反了线程的同步机制;

其次,你如果想要呈现多线程的竞争,不可以在run方法里让一个线程一直运行而不释放锁,应该使用wait()/notify();

以下我稍微修改下,会形成两个线程交替执行的情形:public class ThreadTest {

public static Object obj = new Object();

public static int number = 10;// 用static共享票源,不知道可以不,按理说是可以的

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

MyThread my = new MyThread();

MyThread my2 = new MyThread();

Thread t1 = new Thread(my2, "2号窗口");

Thread t2 = new Thread(my, "1号窗口");

t1.start();

t2.start();

}

static class MyThread implements Runnable {

public void run() {

while (true)

synchronized (obj) {

if (number > 0) {

System.out.println(Thread.currentThread().getName()

+ "正在卖票," + "还剩" + number + "张票");

number--;

obj.notifyAll();

try {

obj.wait();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

} else

break;

}

}

}

}

展开全部 首先,定义的锁(lock)不对,必须是同一e69da5e887aa62616964757a686964616f31333335313235个锁,像你这样用this,new多少个MyThread就有多少个锁,违反了线程的同步机制; 其次,你如果想要呈现多线程的竞争,不可以在run方法里让一个线程一直运行而不释放锁,应该使用wait()/notify(); 以下我稍微修改下,会形成两个线程交替执行的情形:public class ThreadTest { public static Object obj = new Object(); public static int number = 10;// 用static共享票源,不知道可以不,按理说是可以的 /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub MyThread my = new MyThread(); MyThread my2 = new MyThread(); Thread t1 = new Thread(my2, "2号窗口"); Thread t2 = new Thread(my, "1号窗口"); t1.start(); t2.start(); } static class MyThread implements Runnable { public void run() { while (true) synchronized (obj) { if (number > 0) { System.out.println(Thread.currentThread().getName() + "正在卖票," + "还剩" + number + "张票"); number--; obj.notifyAll(); try { obj.wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else break; } } } }
经验分享 程序员 微信小程序 职场和发展