thread.sleep() 引发的疑问
在多线程编程中,使用 thread.sleep() 方法暂停线程时可能会引发疑问,例如:
问题:
在以下代码示例中,thread.sleep(1000*20) 方法被调用。请问此时线程持有的锁是谁?run 对象还是其他对象?
class Run implements Runnable { @Override public void run() { try { System.out.println(Thread.currentThread().getName() + " begin..."); Thread.sleep(1000 * 20); System.out.println(Thread.currentThread().getName() + " over..."); } catch (InterruptedException e) { e.printStackTrace(); } } } public class TestThread { public static void main(String[] args) { Run run = new Run(); new Thread(run).start(); new Thread(run).start(); } }
答案:
在给定的代码中,线程类没有添加任何显式锁。因此,目前不存在所持有的锁的概念。
解释:
thread.sleep() 方法是静态方法,它会暂停调用它的线程的执行。在这种情况下,run 方法没有synchronized关键字,也没有任何其他类型的锁。因此,thread.sleep() 方法不会获取或释放任何锁。
只有在使用诸如 synchronized 或 reentrantlock 之类的同步机制时,线程才需要获取锁。
在IntelliJ IDEA中使用快捷键修改POM文件依赖版本时生成新的repository标签而不是直接修改版本号的原因可能与IDE的自动补全和依赖管理机制有关。以下是一些可能的原因和解决方法:依赖管理机制:IntelliJ IDEA可能会尝试从不同的存储库中查找指定版本的依赖。如果指定的版本在当前配置的存储库中找不到,IDE可能会自动添加新的存储库以确保可以下载到所需的版本。快捷键功能限制:某些快捷键可能只负责版本号的快速修改,而不处理存储库的管理。当你使用快捷键时,IDE可能会默认添加新的存储库以确
Java框架的优点和发展趋势是什么?
Java框架和F#框架在金融领域的优势
Java函数式编程对数据处理的革命性影响
JNA调用C++ DLL时如何避免异常导致JVM崩溃?
Android RecyclerView数据更新后视图不刷新,如何解决?