1. 线程和进程的区别?
进程:进程可以简单理解为进行一个程序,比如说我们打开一个浏览器,打开一个文本,这就是开启了一个进程,一个进程想要在计算机中运行,需要将程序交给CPU,将数据存储在内存中,然后还要在内存和磁盘之间进行一些IO。所以进程就是用来加载指令、管理内存、管理IO的。
线程:线程就是一条条指令流,将这些指令交给CPU就是在运行该线程。一个进程可以有多个线程。
二者区别:进程就是正在运行程序的实例,进程中包含了线程,每个线程执行不同的任务;
不同的进程使用不同的内存空间,在当前进程下的所有线程可以共享内存空间;
线程更轻量,线程上下文切换成本一般比进程要低。
2. 并行和并发有什么区别?
在单核CPU下,线程实际上是串行执行的。一般会将这种线程轮流使用CPU的做法叫做并发(concurrent)。
在多核CPU下,每个核都可以调度运行线程,这时候线程可以是并行的。但是对于其中一个核来说,还是串行执行线程的。
并发指的是同一时间应对多件事情的能力;并行指的是同一时间动手做多件事情的能力。
在多核CPU下,并发是指多个线程轮流使用一个或者多个CPU;并行是同一时间动手做多件事情的能力,4核cpu同时处理4个线程。
3. 创建线程的方式有哪些?
继承Thread类,实现runnable接口,实现Callable接口,使用线程池创建线程(一般在项目中使用)。
那使用runnable和callable创建线程的区别是什么呢?
runnable接口的run方法是没有返回值的,而callable接口的call方法是有返回值的,是个泛型,和Future、FutureTask配合使用来获取异步执行的结果;callable接口的call方法允许抛出异常,而runnable接口的run方法的异常只能在内部进行消化即try...catch,不能继续上抛。
线程的run方法和start方法有什么区别?
start是用来启动线程的,通过该线程调用run方法执行run方法中的逻辑代码,start方法只能被调用一次,因为一个线程开启只能开启一次。
而run方法就是一个普通方法封装了代码逻辑,所以可以调用多次。
4. 线程包括哪些状态,状态之间是如何变化的?
首先线程包含以下6种运行状态:NEW、RUNNABLE、TIMED_WAITING、WAITING、BLOCKED、TERMINATED。
状态之间的转换:首先,当一个线程被创建时,就为NEW状态,接着运行start方法,但这时CPU可能正在处理其他线程,所以暂时该线程没有执行权,直到抢到了CPU执行权,正常情况下就开始执行线程了,这个中间没有执行权的状态叫做RUNNABLE,当线程结束之后就会进入TERMINATED状态,死亡。以上是正常的执行情况,可能遇到一些异常情况,比如说当线程种使用了锁时,别的线程就拿不到锁,无法执行,进入BLOCKED阻塞状态,直到拿到锁。还有,当执行wait()方法时,线程就进入了WAITING等待状态,直到执行notify()方法,将其唤醒。还有一种是当前线程执行sleep(50)方法,就进入了TIMED_WAITING计时等待状态,等到时间了,就可以执行了。
5. 新建T1、T2、T3三个线程,如何保证他们按顺序执行?
可以使用线程中的join()方法等待线程结束。在如下的例子中,在t2中有一个方法是t1.join,意味着t2只有当t1运行结束之后才会执行,这样就能保证线程间按照顺序执行。
6. notify()和notifyAll()有什么区别?
notifyAll:唤醒所有wait的线程;
notify:只随机唤醒一个wait线程。
7. 在Java中wait和sleep方法的不同点?
共同点:wait()和sleep()的效果都是让当前线程暂时放弃CPU的使用权,进入阻塞状态。
不同点:(1)方法归属不同:sleep是Thread的静态方法;而wait都是成员方法,每个对象都有。
(2)醒来时机不同:sleep和wait的线程都会在等待对应时间后醒来。wait还可以被notify唤醒,但是sleep不可以。他们都可以呗打断唤醒。
(3)锁特性不同:wait方法的调用必须先获取该对象的锁,而sleep不需要;wait方法执行后会释放锁,允许其他线程获取到该锁。而sleep如果在synchronized代码中执行,并不会释放对象的锁。
8. 如何停止一个正在运行的线程?
有三种方法可以停止线程:(1) 使用退出标志,使线程正常退出,也就是当run方法执行完后线程终止。(2) 使用stop方法强行终止,但是这种方法已经作废了。(3) 使用interrupt方法中断线程:如果打断阻塞的线程,比如说使用sleep,wait,join方法的线程,线程就会抛出interruptedException异常;如果打断正常的线程,可以根据打断状态来标记是否退出线程。
9. synchronized 关键字的底层原理?
synchronized