1、进程和线程的区别
进程是程序运行和资源分配的基本单位,一个程序至少有一个进程,一个进程至少有一个线程,进程在执行过程中拥有独立的内存单元,而多个线程共享内存资源,减少切换次数,从而效率更高。
线程是进程的一个实体,是cpu调度和分派的基本单位,是比程序更小的能独立运行的基本单位。同一个进程的多个线程之间可以并发执行
2、并行和并发的区别
并发:一个处理器同时处理多个任务,cpu通过时间片切换轮流执行不同的任务
并行:多个处理器或者是多核处理器同时处理多个不同的任务,两个线程互不抢占cpu资源,可以同时进行
3、创建线程有哪几种方式
1、继承Thread类创建线程
2、通过Runnable接口创建线程
3、通过Callable和Future创建线程
4、线程run()和start()的区别
start()是启动一个新线程
run()是线程的任务处理的入口方法
start()方法只能被调用一次,run没有限制
start()不会阻塞主线程,run()会阻塞调用线程
5、线程有哪些状态
1、创建线程:在生成线程对象,并没有调用该线程的start方法,这时线程处于创建状态。
2、就绪状态:当调用了线程的start方法之后,该线程就进入了就绪状态,但此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。
3、运行状态:线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
4、阻塞状态:线程正在运行的时候,被暂停,此时线程处于阻塞状态。
5、死亡状态:如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。
6、sleep()与wait()的区别
sleep()属于Thread的方法,wait()属于Object的方法
sleep()不释放锁,wait()释放锁
sleep()时间到后线程自动恢复
wait()可使用notify()或notifyAll()唤醒
wait()必须在同步块中使用
7、如何唤醒指定的线程
notify()随机唤醒Object上wait的一个线程
notifyAll()唤醒所有正在等待该锁的线程
java6引入的LockSupport类的park()阻塞线程和unpark()唤醒线程
LockSupport调用的是Unsafe类
8、Runnable和Callable有什么区别
Runnable接口中的run()方法的返回值是void
Callable接口中的call()方法是有返回值的,是一个泛型,和Future、FutureTask配合可以用来获取异步执行的结果
9、创建线程池有那几种方式
1、newFixedThreadPool创建一个固定长度的线程池
2、newCachedThreadPool创建一个可缓存的线程池
3、newSingleThreadExecutor创建一个单例线程池
4、newScheduledThreadPool创建一个定时执行任务的线程池
10、线程池有哪些核心参数
1、corePoolSize核心线程数
2、maximumPoolSize最大线程数
3、keepAliveTime空闲线程存活时间
4、TimeUnit时间单位
5、workQueue任务队列
6、threadFactory线程工厂
7、handler拒绝策略
11、线程池的执行流程
12、synchronized底层实现原理
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法进入到临界区,同时它还可以保证共享变量的内存可见性,java中每一个对象都可以作为锁。
普通同步方法,锁是当前实例对象
静态同步方法,锁是当前类的class对象
同步方法块,锁是括号里面的对象
13、java程序中怎么保证多线程的运行安全
线程安全在三个方面体现:
原子性:提供互斥访问,同一时刻只能有一个线程对数据进行操作;
可见性:一个线程对主内存的修改可以及时地被其他线程看到;
有序性:一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序;
14、什么是死锁
死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,他们都将无法推行下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。
15、怎么防止死锁
死锁的四个必要条件:
互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源;
请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放;
不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放;
环路等待条件:是指进程发生死锁后,若干进程之间形成一种头尾相接的循环等待资源关
16、为什么使用线程池
1、降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
2、提高响应速度。当任务到达时,任务可以不需要等到线程的创建就能立即执行。
3、提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配、调优和监控。