Runnable 和 Callable 的区别?
主要区别
Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,支持泛型。
Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方
法允许抛出异常,可以获取异常信息。
如何启动一个新线程、调用 start 和 run 方法的区别?
线程对象调用 run 方法不开启线程。仅是对象调用方法。
线程对象调用 start 开启线程,并让 jvm 调用 run 方法在开启的线程中执行调用 start 方法可以启动线程,
并且使得线程进入就绪状态,而 run 方法只是 thread 的一个普通方法,还是在主线程中执行。
线程有哪几种状态以及各种状态之间的转换?
1. 第一是 new->新建状态。在生成线程对象,并没有调用该对象的 start 方法,这是线程处于
创建状态。
2. 第二是 Runnable->就绪状态。当调用了线程对象的 start 方法之后,该线程就进入了就绪
状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。
3. 第三是 Running->运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线
程就进入了运行状态,开始运行 run 函数当中的代码。
4. 第四是阻塞状态。阻塞状态是线程因为某种原因放弃 CPU 使用权,暂时停止运行。直到线程
进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
(1)等待 – 通过调用线程的 wait() 方法,让线程等待某工作的完成。
(2)超时等待 – 通过调用线程的 sleep() 或 join()或发出了 I/O 请求时,线程会进入到阻塞状态。当 sleep()状态超时、
join()等待线程终止或者超时、或者 I/O 处理完毕时,线程重新转入就绪状态。
(3)同步阻塞 – 线程在获取 synchronized 同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态。
5. 第五是 dead->死亡状态: 线程执行完了或者因异常退出了 run()方法,该线程结束生命周期.