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 为什么线程不在计数3处停止?_Java_Multithreading_Thread Safety - Fatal编程技术网

Java 为什么线程不在计数3处停止?

Java 为什么线程不在计数3处停止?,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,我正在尝试做一些关于线程的练习,我刚刚开始学习线程和其他东西 import java.util.logging.Level; import java.util.logging.Logger; public class ThreadDemo extends Thread { @Override public void run() { int count = 0; for (int i = 0; i <= 5; i++) {

我正在尝试做一些关于线程的练习,我刚刚开始学习线程和其他东西

import java.util.logging.Level;
import java.util.logging.Logger;

public class ThreadDemo extends Thread {

    @Override
    public void run() {
        int count = 0;
        for (int i = 0; i <= 5; i++) {
            count++;
            System.out.println("counting" + count);
        }
        if (count == 3) {
            try {
                Thread t = new Thread();
                t.wait(5000);
                System.out.println("thread waiting");
            } catch (InterruptedException ex) {
                Logger.getLogger(ThreadDemo.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public static void main(String[] args) {
        ThreadDemo obj = new ThreadDemo();
        obj.start();
    }
}
当完成计数=3的测试时,计数的值为6

你的代码只测试一次

您需要将for循环中的代码移出其中

您还需要在呼叫等待之前锁定t。这是通过同步块完成的

@Override
public void run() {
    int count = 0;
    for (int i = 0; i <= 5; i++) {
        count++;
        System.out.println("counting" + count);

        // Moved block
        if (count == 3) {
            try {
                Thread t = new Thread();
                synchronized (t) {  
                    t.wait(5000);
                }
                System.out.println("thread waiting");
            } catch (InterruptedException ex) {
                Logger.getLogger(ThreadDemo.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        // End of moved block
    }
}
使用Thread.sleep替换此代码可以获得类似但不完全相同的结果

Thread t = new Thread();
synchronized (t) {  
   t.wait(5000);
}
以下是:

Thread.sleep(5000);
Thread.sleep和Object.wait之间的区别在于,可以唤醒等待获取锁并调用or的线程


相反,无法唤醒使用thread.sleep睡眠的线程。

count==3始终为false。当你将它增加6倍后,它将是6。我建议您逐步检查调试器中的代码,以便更好地理解它。t.wait5000不会做您认为它会做的事情。当代码执行t.wait5000时,它正在调用对象类wait方法。在处理Object.wait.Worked之前,您应该先阅读,但是如果我想在计数3之后加入,那么我需要做什么才能从3恢复。顺便说一句,您不能在没有锁定的对象上等待。@user156538您只有一个线程在运行。你要加入什么?@user156538正是你想要做的事?经过一段时间后,它会自动启动该线程。这是我想要实现的。
Thread t = new Thread();
synchronized (t) {  
   t.wait(5000);
}
Thread.sleep(5000);