Java多线程面试知识点解析
5星 · 超过95%的资源 需积分: 3 46 浏览量
更新于2024-09-14
收藏 7KB TXT 举报
"Java多线程面试题及详解"
在Java编程中,多线程是不可或缺的一部分,尤其在面试中经常被问到。以下是一些关于Java多线程的常见面试题及其详细解释:
1. **如何在Java中创建线程?**
Java中有两种方式创建线程:一是继承`Thread`类并重写`run()`方法;二是实现`Runnable`接口,并将其实例传递给`Thread`的构造函数。推荐使用后者,因为这样可以避免单继承的限制,提高代码的灵活性。
2. **`Thread.start()`与`Thread.run()`的区别是什么?**
`Thread.start()`是启动新线程的命令,它会调用`Thread.run()`方法,但这个调用是在另一个线程上下文中执行的,即JVM会为这个线程分配CPU时间片。而直接调用`Thread.run()`则是在当前线程中执行,不会创建新的线程。
3. **为什么不能直接调用`run()`来启动线程?**
直接调用`run()`方法只是执行了`run()`中的代码,没有创建新的线程。必须使用`start()`方法,因为`start()`会触发JVM进行线程调度,使线程进入就绪状态,等待CPU分配执行时间。
4. **什么是`ThreadLocal`?**
`ThreadLocal`是Java提供的一种线程局部变量,每个线程都有自己的`ThreadLocal`副本,互不干扰。例如,在DAO模式中,我们可以使用`ThreadLocal`为每个线程维护一个数据库连接,避免在多个线程间共享同一个连接,从而提高并发安全性。IBM DeveloperWorks上有一篇关于`ThreadLocal`的好文章,建议参考。
5. **何时会抛出`InvalidMonitorStateException`异常?**
当在没有持有对象锁的情况下调用`wait()`, `notify()`, 或 `notifyAll()`时,就会抛出`InvalidMonitorStateException`。这些方法应该在同步块(`synchronized`关键字)内调用,以确保当前线程持有对象锁。如果不在同步块内调用,会抛出`IllegalMonitorStateException`。
6. **`sleep()`, `suspend()`, `wait()`之间的区别是什么?**
- `Thread.sleep()`让当前线程暂停指定的时间,不会释放任何锁。它会抛出`InterruptedException`,当线程在睡眠期间被中断时,异常会被抛出。
- `Thread.suspend()`已废弃,因为它会导致死锁。当一个线程调用`suspend()`时,它不会释放任何锁,而其他线程可能正在等待这个锁,导致僵局。
- `wait()`使当前线程等待,直到其他线程调用`notify()`或`notifyAll()`。它必须在同步块内调用,否则会抛出`IllegalMonitorStateException`。`wait()`会释放对象锁,使其他线程有机会获取锁并唤醒等待的线程。
了解这些基本概念对于理解和解决多线程问题至关重要。在实际编程中,正确地使用这些机制可以提高程序的效率和并发安全性。在面试中,深入理解这些知识点有助于展示你的专业技能。
488 浏览量
1528 浏览量
136 浏览量
1009 浏览量
227 浏览量
136 浏览量
169 浏览量
2024-08-10 上传
168 浏览量