1.进程、线程?
概念上:进程:程序运行和资源分配的基础单位;线程:cpu调度和分配的基本单位;
现实中:打开资源管理器,管理的是进程;在Linux中经常使用 kill -9 XX来杀死一个线程;
总的来说,一个程序最少有1个进程(main方法执行的),1个进程至少有1个线程。线程是进程的一个实体,是比进程更小的,能独立运行的基本单位。
2.线程创建方式?
(1)继承Thread类,重写run()方法,调用start()方法;
(2)实现Runnable接口,重写run()方法,调用Thread类的构造方法,然后调用其的start()方法。
(3)采用线程池创建,一般有两种方式:其一,通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用(newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor);其二,通过ThreadPoolExecutor类进行自定义创建。
(4)通过Callable和Future创建线程。
3.线程的生命周期?
创建-运行-中断-死亡
4.线程的几个状态?
(1)新建状态(New):new一个线程;
(2)就绪状态(Runnable):调用start()方法,进入可运行线程池中,等待获取CPU使用权;
(3)运行状态(Running):调用run()方法,就绪状态的线程获取了CPU,进入运行状态;
(4)阻塞状态(Blocked):调用sleep(),wait()让出CPU,阻塞于锁,使本线程进入到阻塞状态;
(5)死亡状态(Dead):线程run()完毕或者调用stop()方法来结束线程。
5.sleep()和wait()的区别?
其一,sleep()是Thread类的方法,wait()是Object类的方法;
其二,sleep()不释放锁,wait()释放锁;
其三,wait()需要notify()和notifyAll()来唤醒。
6.多线程锁的升级原理是什么?
在Java中,锁共有4种状态,级别从低到高依次为:
无锁->偏向锁->轻量级锁->重量级锁,锁可以升级但不能降级。
无锁:单线程运行,没有其他线程竞争;
偏向锁:无状态锁在一段时间之后会升级为轻量级锁;
轻量级锁:多线程运行,有轻微竞争;
重量级锁:多线程运行,竞争激烈;
7.synchronized的使用?
synchronized可用于修饰类,方法,代码块;
修饰类,其作用的范围是synchronized后面括号括起来的部分,作用的对象是这个类的所有对象;
修饰静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
修饰方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
修饰代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
可参考链接:
JAVA中创建线程池的五种方法及比较 - PC君 - 博客园
Java并发编程之线程池、Callable和Future使用_loongshawn的博客-CSDN博客_callable 线程池