一:进程与线程是什么?
进程:是指一个内存中运行的应用程序
线程:进程内部的一个独立执行单元;一个进程可以同时并发的运行多个线程,是调度执行的基本单位
二:创建线程有几种方式?
1:继承Thread,重写Run方法,用start方法启动
2:实现Runable接口,重写run方法,用Strart方法启动
3:使用线程池创建线程
4:通过Callable和FutureTask创建线程
public class TestController {
public static void main(String[] args) throws ExecutionException, InterruptedException {
FutureTask<String> stringFutureTask = new FutureTask<>(new MyThread());
//两个线程去执行 Callable只会打印一次,因为缓存提高效率
new Thread(stringFutureTask,"a").start();
new Thread(stringFutureTask,"B").start();
String s = stringFutureTask.get(); //可能产生堵塞
System.err.println(s);
}
}
class MyThread implements Callable<String> {
@Override
public String call() throws Exception {
System.err.println("call");
return "11";
}
}
三:Runnable和Callable区别?
Runnable的run方法无返回值,Callable的call方法有返回值,类型为Object
四:锁的分类?
- 悲观锁和乐观锁
悲观锁:认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改
乐观锁:认为自己在使用数据时不会有别的线程修改数据或资源,所以不会添加锁。 - 公平锁和非公平锁
公平锁:是指多个线程按照申请锁的顺序来获取锁
非公平锁:是指多个线程获取锁的顺序并不是按照申请锁的顺序 - 可重入锁(ReentrantLock 和 synchronized)
是指同一个线程在外层synchronized方法获取锁的时候,再进入内层synchronized方法会自动获取锁(前提,锁对象得是同一个对 象) - 隐式锁和显示锁
显示锁:加锁几次就要解锁几次(ReentrantLock) - 死锁
死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象