第7章多线程
7.1什么是进程?什么是线程?进程与线程的关系是怎样的?
【答】进程:进程是一个可并发的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位。
线程:线程是操作系统进程中能够独立执行的实体,是处理器调度和分派的基本单位。线程是进程的组成部分,每个进程内允许包含多个并发执行的线程。
7.2操作系统为什么要支持多线程技术?
【答】操作系统采用进程机制能够减少程序并发时所付出的时空开销,使得并发粒度更细,并发性更好,提高了资源使用率和系统效率。
7.3Java为什么要支持线程?什么场合需要使用多线程程序设计?
【答】支持多线程能充分发挥硬件的并发性,消除处理器和I/O设备的互等现象,提高系统效率。一般一下场合需要使用多线程:
1、程序包好复杂的计算任务时,主要是利用多线程获取更所得CPU时间。
2、处理速度较慢的外围设备。
3、程序设计自身的需要。
7.4Java提供了哪些接口和类实现多线程机制?
【答】Java主要提供了java.lang.Runnable接口和Thread线程类来实现多线程机制。
7.5一个线程对象的生命周期有哪几种状态构成?各状态之间是如何变化的?
【答】
线程对象的生命周期主要包括:新建态、就绪态和运行态、阻塞态和等待态、终止态。新建态通过start()方法是线程成为运行态,当运行态遇到sleep()或wait()方法时就进入等待态,而当sleep()时间到或通过notify()方法线程就又进入了运行态;当运行态遇到synchronized()方法时就进入阻塞态,当线程获得互斥锁使用权时就又到了运行态;当线程的run()方法结束时整个线程就进入了终止态,整个线程结束。
7.6Java提供了哪些方法能够改变线程状态?程序中能够调度线程立即执行吗?
【答】Java中提供了start()方法来启动已创建的线程对象;sleep()方法使当前线程睡眠若干毫秒,线程有运行态进入等待态,但是不交出临界区的锁;yield()方法暂停当前线程的执行,允许其他线程竞争CPU;stop()方法来结束一个线程;wait()方法将本线程设为等待态;notify()方法来唤醒当前处于等待态的线程;interrupt()方法改变当前线程的中断状态,但是当前线程还可以继续执行。
7.7什么是线程的优先级?设置线程优先级有什么作用?
【答】每个线程被执行的优先顺序即为线程的优先级,默认优先级为5。当创建了多个线程并要执行这些线程时,操作系统不知到底该执行哪个线程,当设置好优先级后,程序首先会执行优先级最高的线程,然后依次执行下去。这样处理器将会合理而且充实的额被利用,不会造成资源的浪费或者运行的混乱。
7.8线程按什么规则排队等待?
【答】线程按优先级排队,线程调度语句优先级基础上的“先到先服务”原则
7.9多线程间共享数据时会发生怎样的并发执行错误?
【答】当几个线程共享数据时,一个线程的执行可能影响其他线程的执行结果,并导致错误的程序运行结果。
7.10在什么情况下需要采用线程同步机制?
【答】当并发执行的多个线程间需要共享资源或交换数据时,各个线程执行时相互之间会干扰或影响其他线程的执行结果,这时就需要采用线程同步机制。
7.11关键字synchronized是什么含义?为什么wait()和notify()方法要与synchronized同时使用?
【答】synchronized用于声明一段程序为临界区,使线程对临界资源采用互斥使用方式。
wait()和notify()不是属于线程类,而是每一个对象都具有的方法,而且这两个方法都和对象锁有关,有锁的地方必有synchronized()方法,故wait()和notify()方法要与synchronized同时使用。
7.12明sleep()和wait()方法的异同。
【答】wait是Object类的方法,sleep与yield都是Thread类的方法。wait调用的时候需要注意的是该方法是释放锁标志的,而sleep在调用的时候是紧紧抱着锁标志的,也就是等他完全执行完成了才可以让其他线程来访问的
sleep方法使当前运行中的线程睡眼一段时间,进入不可运行状态,这段时间的长短是由程序设定的,yield方法使当前线程让出CPU占有权,但让出的时间是不可设定的。
7.13一个对象为什么需要调用wait()方法使当前线程等待?
【答】wait()使当前线程进入停滞状态时,还会释放当前线程所占有的“锁标志”,从而使线程所在对象中的其它synchronized数据可被别的线程使用。当调用sleep()方法时,该线程不会释放当前线程所占有的“锁标志”。
7.14什么是死锁?什么情况下会死锁?
【答】由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。
当多个线程同时被阻塞,他们中的一个或者全部都在等待某个资源被释放,由于线程被无限期地阻塞,因此程序处于非正常终止,才会产生死锁。