进程:
正在内存中运行的应用程序,是系统进行资源分配的最小单位,每一个进程都有独立的内存空间。一个进程可以有多个线程。
多进程,提高CPU使用率。
线程:
线程是程序执行中一个单一的顺序控制流程,是处理器任务调度和执行的最小单位。
一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
单线程:程序只有一个执行路径。
多线程:程序有多个执行路径。为了提高应用程序的使用率。
进程=火车 线程=车厢
并发:
在同一个时间段内,同时执行多个任务。(多个任务之间,互相抢占资源)
并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行。如:打游戏和听音乐两件事情在同一个时间段内都是在同一台电脑上完成了从开始到结束的动作。那么,就可以说听音乐和打游戏是并发的。
并行:
在同一个时间点,同时执行多个任务。(多个任务之间,不互相抢占资源)
run()和start()的区别:
run():封装被线程执行的代码,直接调用该方法相当于调用了一个普通方法。
start():首先启动线程,然后由JVM调用线程的run()方法。
JVM启动是单线程,还是多线程?
多线程,至少启动了主线程和垃圾回收线程。
线程的生命周期?
Thread和Runnable的区别?
多线程有几种实现方案,分别是?
继承Thread类
实现Runnable接口
实现Callable接口,与线程池结合
同步有几种方式,分别是?
同步代码块
同步方法
sleep()和wait()的区别
sleep():必须指定时间;不释放锁。
wait():可以不指定时间,也可以指定时间;释放锁。
为什么wait(),notify(),notifyAll()都定义在Object类中?
这些方法的调用是依赖于锁对象的,而同步代码块的锁对象是任意锁,而Object代表任意的对象。
使线程从运行状态到阻塞状态?
wait() 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
join() 等待该线程终止。(插队)
sleep() 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行)。
yield() 暂停当前正在执行的线程对象,并执行其他线程。
interrupt()
线程中断只是一个状态而已,true表示已中断,false表示未中断。 设置线程中断不影响线程的继续执行,
但是线程设置中断后,线程内调用了wait、jion、sleep方法中的一种, 立马抛出一个 InterruptedException,且中断标志被清除,重新设置为false。