Java线程阻塞:原因
- 1. sleep()
- 2. suspend() 和 resume()(不推荐)
- 3. yield()
- 4. wait() 和 notify()/notifyAll()
💖The Begin💖点点关注,收藏不迷路💖 |
线程阻塞是一个重要的概念,它决定了线程何时能够执行。以下是几种常见的线程阻塞原因。
1. sleep()
sleep()方法使线程暂停执行指定的时间(毫秒为单位),期间线程不会占用CPU资源。常用于等待资源就绪或实现简单的延时。
try { Thread.sleep(1000); // 线程暂停1秒
} catch (InterruptedException e) { e.printStackTrace();
}
2. suspend() 和 resume()(不推荐)
这两个方法曾用于暂停和恢复线程,但已废弃,因为它们可能导致死锁和其他同步问题。现代Java程序应避免使用。
最佳实践: 避免使用suspend()和resume(),改用wait()/notify()或Lock/Condition等更现代的同步机制。
3. yield()
yield()方法建议当前线程放弃CPU,但不保证立即发生。它可以在一定程度上提高程序的响应性,但过度使用可能影响性能。
Thread.yield(); // 建议当前线程放弃CPU
4. wait() 和 notify()/notifyAll()
wait()使线程等待,直到其他线程调用notify()或notifyAll(),或等待超时。这是线程间通信的关键机制,用于协调线程间的执行顺序。
synchronized(obj) { while (!condition) { obj.wait(); // 等待条件满足 } // 处理逻辑
} // 在另一个线程中
synchronized(obj) { // 修改条件 obj.notify(); // 或 obj.notifyAll();
}
💖The End💖点点关注,收藏不迷路💖 |