Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么这段代码在运行一段时间后总是不打印任何内容?_Java_Multithreading - Fatal编程技术网

Java 为什么这段代码在运行一段时间后总是不打印任何内容?

Java 为什么这段代码在运行一段时间后总是不打印任何内容?,java,multithreading,Java,Multithreading,我运行main方法一段时间后,它将始终不打印任何内容 但如果我取消注释“System.out.println(111);”和“System.out.println(222);”,我想它会正常运行 我获取“soldWorker”线程和“ReturnWorker”线程的转储,它们在if判断处停止 public class ProducerAndConsumer2 { public static void main(String[] args) { SyncTikcet2 s

我运行main方法一段时间后,它将始终不打印任何内容

但如果我取消注释“System.out.println(111);”和“System.out.println(222);”,我想它会正常运行

我获取“soldWorker”线程和“ReturnWorker”线程的转储,它们在
if
判断处停止

public class ProducerAndConsumer2 {

    public static void main(String[] args) {
        SyncTikcet2 syncTikcet = new SyncTikcet2(1);

        Runnable syncSoldTicket = () -> syncTikcet.soldTicket();
        Runnable syncRefundTicket = () -> syncTikcet.refund();

        new Thread(syncSoldTicket, "soldWorker").start();
        new Thread(syncRefundTicket, "refundWorker").start();
    }
 }

class SyncTikcet2 {

    private Integer ticketNum;

    public SyncTikcet2(Integer ticketNum) {
        this.ticketNum = ticketNum;
    }


    public void soldTicket() {
        while (true) {
            if (ticketNum > 0) {
                ticketNum = ticketNum - 1;
                System.out.println("sold ticket,the num is" + ticketNum);
            } else {
                // System.out.println(111);
            }
        }
    }

    public void refund() {
        while (true) {
            if (ticketNum == 0) {
                ticketNum = ticketNum + 1;
                System.out.println("refund ticket,the num is" + ticketNum);
            } else  {
                // System.out.println(222);
            }
        }
    }

    public Integer getTicketNum() {
        return ticketNum;
    }

    public void setTicketNum(Integer ticketNum) {
        this.ticketNum = ticketNum;
    }
}

如果您没有使字段不稳定,线程就没有理由重新读取它没有更改的值

尝试使用
private volatile int ticketNum


我建议使用原语,例如
int
,除非必须使用对象引用。它不仅速度更快,而且还清楚地表明您不希望值为
null

非常感谢,您太棒了,您的答案引导我找到另一个问题。这个问题和我的一样,答案更详细。再次非常感谢。@wr1ttenyuzhao note System.out.println有一个
同步的
内存障碍,但是如果没有调用它,您可能看不到更新。是的,这就是为什么当我取消注释“System.out.println(111);”和“System.out.println(222);”时它会正常运行的原因,谢谢您的回答,您是个好人,谢谢