本文主要是介绍2024年150道高频Java面试题(三十),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
59. runnable 和 callable 有什么区别?
Runnable
和Callable
是Java中用于定义可以由线程执行的任务的接口。
- 返回值:
Runnable
不返回任何值。它的run()
方法没有返回类型,即void
。Callable
的call()
方法具有返回值。它可以返回任何类型的对象,也可以抛出异常。
- 异常处理:
Runnable
的run()
方法不能抛出检查异常(checked exception)。任何发生的异常都需要在内部捕获。Callable
的call()
方法可以抛出检查异常。
- 使用场景:
Runnable
通常用于简单的任务,不需要返回结果。Callable
通常用于需要返回结果或者抛出异常的任务。
- 执行方式:
Runnable
通常通过Thread
类或ExecutorService
的execute()
方法执行。Callable
通常通过ExecutorService
的submit()
方法执行,submit()
会返回一个Future
对象,该对象表示任务的潜在结果。
下面是两个接口的代码示例:
// Runnable 示例
Runnable runnable = new Runnable() {@Overridepublic void run() {// 代码逻辑}
};// Callable 示例
Callable<String> callable = new Callable<String>() {@Overridepublic String call() throws Exception {// 代码逻辑return "Result";}
};
总结:
特性 | Runnable | Callable |
---|---|---|
返回值 | 无 | 有 |
异常处理 | 不能抛出检查异常 | 可以抛出检查异常 |
使用场景 | 简单任务 | 需要结果或异常的任务 |
执行方式 | Thread 或ExecutorService.execute() | ExecutorService.submit() |
这两个接口都提供了定义任务的方法,但它们在返回值和异常处理方面有所不同,因此可以根据不同的需求选择合适的接口。
60. 线程有哪些状态?
线程在其生命周期中有几种不同的状态,这些状态描述了一个线程从创建到消亡的过程。以下是Java线程可能处于的状态:
- 新建(New):
- 当一个线程被创建但尚未启动时,它处于新建状态。此时,线程已经存在,但是它的
start()
方法尚未被调用。
- 当一个线程被创建但尚未启动时,它处于新建状态。此时,线程已经存在,但是它的
- 就绪(Runnable):
- 一旦线程调用了
start()
方法,线程进入就绪状态,等待被线程调度器选中获取CPU的执行时间。在就绪状态,线程可能正在执行,也可能在等待CPU分配执行时间。
- 一旦线程调用了
- 运行(Running):
- 当线程调度器选中一个就绪状态的线程时,该线程进入运行状态,开始执行其
run()
方法中的代码。
- 当线程调度器选中一个就绪状态的线程时,该线程进入运行状态,开始执行其
- 阻塞(Blocked):
- 当线程试图获取一个内部对象锁(例如进入一个同步块)而该锁被其他线程持有时,该线程进入阻塞状态。当锁被释放,并且该线程获得了锁,它将返回到就绪状态。
- 等待(Waiting):
- 当线程等待另一个线程执行特定操作时,它进入等待状态。这通常发生在调用
Object.wait()
、Thread.join()
或者等待某些LockSupport
parking操作时。
- 当线程等待另一个线程执行特定操作时,它进入等待状态。这通常发生在调用
- 计时等待(Timed Waiting):
- 和等待状态类似,但线程在等待其他线程执行操作时会等待一个指定的时间。进入计时等待状态的常见方法包括带有超时的
Thread.sleep(long millis)
、Object.wait(long timeout)
、Thread.join(long millis)
等。
- 和等待状态类似,但线程在等待其他线程执行操作时会等待一个指定的时间。进入计时等待状态的常见方法包括带有超时的
- 终止(Terminated):
- 当线程的
run()
方法正常执行完毕,或者出现未捕获的异常导致线程提前终止,线程进入终止状态。
- 当线程的
以下是一个简单的表格来总结上述状态:
状态名称 | 描述 |
---|---|
新建 | 线程被创建但未启动 |
就绪 | 线程准备好执行,等待CPU调度 |
运行 | 线程正在执行 |
阻塞 | 线程等待获取内部锁 |
等待 | 线程无限期等待其他线程的操作 |
计时等待 | 线程等待其他线程操作,但有超时时间 |
终止 | 线程完成执行 |
理解这些状态对于并发编程非常重要,因为它们有助于开发者在编写多线程应用时诊断和解决线程同步和通信问题。
有帮助请点赞收藏呀~
领【150 道精选 Java 高频面试题】请 go 公众号:码路向前 。
这篇关于2024年150道高频Java面试题(三十)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!