进程和线程的区别
- 进程是正在运行程序的实例,进程包含了线程,每个线程执行不同的任务
- 不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间
- 线程更轻量,线程上下文切换成本比进程低
创建线程的方式有哪些
- 继承Thread类
- 实现runnable接口
- 实现Callable接口
- 线程池创建线程
runnable和callable有什么区别
- runnable接口run方法没有返回值
- callable接口call方法有返回值,需要future task获取结果
- callable接口call方法允许抛出异常,runnable接口的run方法的异常需要内部消化,不能抛出。
run()和start()有什么区别?
- run:封装了要被线程执行的代码,可以被多次调用
- start:用来启动线程,通过该线程调用run方法执行run方法中所定义的逻辑代码,start方法只能被调用一次。
线程包括哪些状态
新建T1、T2、T3三个线程,如何保证它们按顺序执行?
可以使用线程中join方法来解决,join本身的作用是等待线程运行结束,所以可以给这三个线程依次 .join(), 表示阻塞调用此方法的线程进入timed_waiting直到上个线程完成后,此线程再继续执行
notify()和notifyAll()有什么区别?
- notify:只随机唤醒一个wait线程
- noitfyAll:唤醒所有wait的线程
Java中wait和sleep方法的不同?
如何停止一个正在运行的线程?
- 使用退出标志,使线程正常退出,也就是当run方法完成后线程终止
- 使用stop方法强行终止(这个方法不推荐)
- 使用interrupt方法中断线程
- 打断阻塞的线程(sleep、wait、join)的线程,线程会抛出interruptedException异常
- 打断正常的线程,可以根据打断状态标记是否退出线程
synchronized和lock的区别?
- synchronized是关键字,lock是接口
- 使用synchronized时,退出同步代码块锁会自动释放,lock的话,需要手动调用unlock方法释放锁。
- 他们俩都是悲观锁,都具备互斥、同步、锁重入功能,但是lock提供了许多synchronized不具备的功能,比如公平锁、可打断、可超时等。
- 性能方面的话:如果没有竞争时候,synchronized做了许多优化,如轻量级锁、偏向锁。如果竞争激烈时,lock的实现通常会提供更好的性能。
死锁产生的条件和如何进行死锁诊断?
一个线程需要同时获取多把锁,这个样子就会发生死锁
- 当程序出现死锁的现象,我们可以使用jdk自带工具:jps和jstack
- jps:输出jvm中运行的进程状态信息
- jstack:查看Java进程内线程的堆栈信息,查看日志,检查是否有死锁,如果有死锁现象,需要查看具体代码分析后,修复
- 可视化工具jconsole,VisualJvm也可以检查死锁问题。
说一下线程的核心参数
线程池的执行原理
如何确定核心线程数