并发编程——线程的基础知识

92 阅读3分钟

1.并行与并发有什么区别?

难易程度:2

出现频率:2

并发:两个及两个以上的作业在同一时间段内执行。

并行:两个及两个以上的作业在同一时刻执行。

2.创建线程的方式有哪些?

难易程度:2

出现频率:4

一共有4种方式可以创建线程,分别是:

1)继承Thread类

2)实现runnable接口

3)实现Callable接口

4)线程池创建线程(项目中所使用的方法)

image.png

3.线程包括哪些状态,状态之间是如何变化的?

难易程度:3

出现频率:4

1.6个状态,新建(NEW)、可运行(RUNNABLE)、阻塞(BLOCKED)、等待(WAITING)、时间等待(TIMED_WAITING)、终止(TERMINATED)

1)创建线程对象是新建状态

2)调用了start()方法转变为可执行状态

3)线程获取到了CPU的执行权,执行结束是终止状态

4)在可执行状态的过程中,如果没有获取CPU的执行权,可能会切换其他状态

4.1)如果没有获取锁进入阻塞状态,获得锁再切换为可执行状态

4.2)如果线程调用了wait()方法进入等待状态,其他线程调用notify()唤醒后可切换为可执行状态

4.3)如果线程调用了sleep(50)方法,进入计时等待状态,到时间后可切换为可执行状态

image.png

4.新建T1、T2、T3三个线程,如何保证它们按顺序执行?

难易程度:2

出现频率:3

可以使用线程中的join方法解决

join() 方法的作用:等待线程运行结束,例如:t.join():阻塞调用此方法的线程进入timed_waiting,直到线程t执行完成后,此线程再继续执行。

5.notify()和notifyAll()的区别?

notify():只随机唤醒一个wait线程

notifyAll():唤醒所有wait的线程

6.在java中wait和sleep方法的不同?

共同点

wait(),wait(long)和 sleep(long)的效果都是让当前线程暂时放弃 CPU 的使用权,进入阻塞状态

不同点
1)方法归属不同

sleep(long)是 Thread 的静态方法

而 wait(),wait(long)都是 Object 的成员方法,每个对象都有

2)醒来时机不同

执行 sleep(long)和 wait(long)的线程都会在等待相应毫秒后醒来

wait(long)和 wait() 还可以被 notify 唤醒,wait() 如果不唤醒就一直等下去

它们都可以被打断唤醒

3)锁特性不同(重点)

wait 方法的调用必须先获取 wait 对象的锁,而 sleep 则无此限制

wait 方法执行后会释放对象锁,允许其它线程获得该对象锁(我放弃 cpu,但你们还可以用)

而 sleep 如果在 synchronized 代码块中执行,并不会释放对象锁(我放弃 cpu,你们也用不了)

7.如何停止一个正在运行的线程?(3种方式)

1)使用退出标志,使线程正常退出,也就是当run方法完成后线程终止

2)使用stop方法强制终止(不推荐,方法已作废)

3)使用interrupt方法中断线程

打断阻塞的线程(sleep、wait、join)的线程,线程会抛出InterruptedException异常

打断正常的线程,可以根据打断状态来标记是否退出线程