1.进程和线程的区别是什么?
进程是执行着的程序,而线程是进程内部的一个执行序列。一个进程可以有多个线程。
2.创建线程有几种不同的方式?你喜欢哪一种?为什么?
*继承Thread类
*实现runnable接口
*应用程序可以使用executor框架创建线程池
我喜欢实现runnable接口,因为java不支持多继承,实现接口就避免了在继承thread类后还需要继承别的类的情况。
3.概括的解释下线程的几种可用状态。
*就绪(runnable):线程准备运行,不一定马上执行。
*运行中(running):进程正在执行进程的代码。
*等待中(waiting):线程处于阻塞的状态,等待外部的处理结束。
*睡眠中(sleeping):线程被强制睡眠。
*I/O阻塞:等待io操作完成。
*同步阻塞:等待获取锁。
*死亡(dead):线程完成了执行。
4.同步方法和同步代码块的区别是什么?
在java语言中,每一个对象都有一把锁。线程可以使用synchronized关键字来获取对象上的锁,可以应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁)。
5.什么是死锁?
两个线程都在等待对方执行完毕才能继续往下执行的时候就发生了死锁,结果就是两个线程陷入了无限的循环当中。
6.如何确保N个线程可以访问N个资源同时又不导致死锁?
指定获取锁的顺序,并强制要求线程按照顺序获取锁。
7.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?
1.其他方法前是否加了synchronized关键字。如果没有,则能。
2.如果这个方法内部调用了wait,则可以进入其他synchronized方法。
3.如果其他方法都加了synchronized关键字,并且内部没有调用wait,则不能。