我
如果是这样
@Override
public void run() {
while (true){
if(ticketNums <= 0){
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"拿到了第"+ ticketNums-- +"张票");
// System.out.println(ticketNums);
}`
以上代码段才是正确的逻辑 但是输出结果是
居然有黄牛党和老师同时都拿到了第7张票 这是不应该的呀
我是一步步改代码 票的数量才能一步步实现递减 最终代码是这样的
//多个线程同时操作一个对象
//买过车票的例子
public class TestThread4 implements Runnable {
//票数
public int ticketNums = 10;
@Override
public void run() {
while (ticketNums>2){
// if(ticketNums == 0){
// break;
// }
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"拿到了第"+ ticketNums-- +"张票");
// System.out.println(ticketNums);
}
}
public static void main(String[] args) {
TestThread4 ticket = new TestThread4();
new Thread(ticket,"小明").start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(ticket,"老师").start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(ticket,"黄牛党").start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
请前辈给指点一下 , 我是怀疑现在的处理器速度太快,会不会是两个线程同时对ticketNum操作了
才导致不能正确输出结果。
我通过改while循环的判断条件 和 增加每个线程之间开始的时间 才解决的问题 但是逻辑上没问题的呀
最后在群里请教了同学,加个锁就好了 代码如下
package testThread;
//多个线程同时操作一个对象
//买过车票的例子
public class TestThread4 implements Runnable {
//票数
private static volatile int ticketNums = 10;
private static Object obj = new Object();
@Override
public void run() {
while (true){
if(ticketNums<=0){
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj){
if(ticketNums > 0){
System.out.println(Thread.currentThread().getName()+"拿到了第"+ ticketNums-- +"张票");
}else {
System.out.println("谢谢惠顾");
}
}
}
}
public static void main(String[] args) {
TestThread4 ticket = new TestThread4();
new Thread(ticket,"小明").start();
new Thread(ticket,"老师").start();
new Thread(ticket,"黄牛党").start();
}
}