1. Thread类中的start()和run()方法有什么区别?
- start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。然后通过此Thread类调用方法run()来完成其运行操作的,这里方法run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程中止。然后CPU再调度其他线程。
- run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码;程序中只有主线程这一个线程,其程序执行路径还是只有一条,这样就没有达到写线程的目的
2. 线程NEW状态
- new创建一个Thread对象时,并没处于执行状态,因为没有调用start方法启动该线程,那么此时的状态就是新建状态
3. 线程RUNNABLE状态
- 线程对象通过start方法进入runnable状态,启动的线程不一定会立即得到执行,线程的运行与否要看cpu的调度,我们把这个中间状态叫可执行状态(RUNNABLE)
4. 线程的RUNNING状态
- 一旦cpu通过轮询或其他方式从任务中可以执行队列中选中了线程,此时它才能真正的执行自己的逻辑代码
5. 线程的BLOCKED
- 线程正在等待获取锁
- 进入BLOCKED状态,比如调用了sleep或者wait方法
- 进行某个阻塞的io操作,比如因网络数据的读写进入BLOCKED状态
- 获取某个锁资,从而加入到该锁的阻塞队列中而进入BLOCKED状态
6. 线程的TERMINATED状态
- TERMINATED是一个线程的最终状态,在该状态下线程不会再切换到其它任何状态了,代表整个生命周期都结束了
- 以下几种情况会进入TERMINATED状态:
- 线程运行正常结束,结束生命周期
- 线程运行出错意外结束
- JVM Crash导致所有的线程都结束
7. 线程状态转化图
8. 如何知道代码段被哪个线程调用?
System.out.println(Thread.currentThread().getName());
9. 线程活动状态?
public class xkThread extends Thread{
@Override
public void run(){
System.out.println("run run run is "+ this.isAlive());
}
public static void main(String[] args){
xkThread xk = new xkThread();
System.out.println("begin---"+xk.isAlive());
xk.start();
System.out.println("end---"+xk.isAlive());
}
}
10. sleep()方法
- 方法sleep()的作用是在指定的毫秒数内让当前的“正在执行的线程”休眠(暂停执行)
- jdk1.5之后,引入了一个枚举TimeUnit,对sleep()方法提供了很好的封装,如要表达2小时22分55秒899毫秒
Thread.sleep(857899L);
TimeUnit.HOURS.sleep(3);
TimeUnit.MINUTES.sleep(22);
TimeUnit.SECONDS.sleep(55);
TimeUnit.MILLISECONDS.sleep(899);
上一篇:Java面试手册V2.0+突击V3.0知识点整理(十三) 附封面图片😍
下一篇:Java面试手册V2.0+突击V3.0知识点整理(十五) 附封面图片😍
如果觉得封面图片还行,请顺手点个赞😍