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