我已经编写了下面的 Java 程序。该程序正在创建三个线程并启动它们:
public class MyThread implements Runnable {
@Override
public synchronized void run() {
int count = 0;
while (true) {
System.out.println("" + Thread.currentThread().getName());
if (count == 20 && Thread.currentThread().getName().equals("Thread-1")) {
try {
Thread.currentThread().sleep(100000000);
} catch (Exception ex) {
ex.printStackTrace();
}
}
count++;
}//while ennds here
}//run ends here
}//class ends here
public class TestThread {
public static void main(String[] args){
Thread t1 = new Thread(new MyThread());
t1.setName("Thread 1");
Thread t2 = new Thread(new MyThread());
t1.setName("Thread 2");
Thread t3 = new Thread(new MyThread());
t1.setName("Thread 3");
t1.start();
t2.start();
t3.start();
}
}
一段时间后,第二个线程进入睡眠状态。
由于 run 方法是同步的,因此应该一次只能由一个线程访问。
Sleep 方法永远不会释放对象上的锁。但是,一旦“线程 1”进入睡眠状态,之后“线程 2”和“线程 3”就可以成功访问相同的方法并继续执行。
谁能解释这里发生了什么?根据睡眠的概念,在“线程 1”进入睡眠后,执行应该暂停。