一.概念性问答题
第一题:线程的基本概念、线程的基本状态及状态之间的关系?
答:
一个程序中可以有多条执行线索同时执行,一个线程就是程序中的一条执行线索,每个线程上都关联有要执行的代码, 即可以有多段程序代码同时运行,每个程序至少都有一个线程,即main方法执行的那个线程。单cpu可以使用时间片轮转或者切换的方式,交替调用线程。
就绪:线程分配了CPU以外的全部资源,等待获得CPU调度 执行:线程获得CPU,正在执行 阻塞:线程由于发生I/O或者其他的操作导致无法继续执行,就放弃处理机,转入线程就绪队列 挂起:由于终端请求,操作系统的要求等原因,导致挂起。 java多了一个新建状态:新建状态(New)
用new语句创建的线程对象处于新建状态,此时它和其他Java对象一样,仅被分配了内存。
就绪状态(Runnable)
当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。
处于这个状态的线程位于Java虚拟机的可运行池中,等待CPU的使用权。
运行状态(Running)
处于这个状态的线程占用CPU,执行程序代码。在并发运行环境中,如果计算机只有一个CPU,那么任何时刻只会有一个线程
处于这个状态。本章范例都假定运行在只有一个CPU的计算机上。如果计算机有多个CPU,那么同一时刻可以让几个线程占用
不同的CPU,使它们都处于运行状态。只有处于就绪状态的线程才有机会转到运行状态。
阻塞状态(Blocked)
阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行。当线程处于阻塞状态时,Java虚拟机不会给线程分配CPU,
直到线程重新进入就绪状态,它才有机会转到运行状态。
死亡状态(Dead)
当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,
该线程结束生命周期。
第二题:线程与进程的区别?
一个程序至少有一个进程,一个进程至少有一个线程.
线程是指进程内的一个执行单元,也是进程内的可调度实体. 与进程的区别: (1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间; (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源 (3)线程是处理器调度的基本单位,但进程不是. 4)二者均可并发执行.
线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。
进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:
1.线程ID
每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标
识线程。
2.寄存器组的值
由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线
由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线
程切换到另一个线程上
时,必须将原有的线程的寄存器集合的状态保存,以便
将来该线程在被重新切换到时能得以恢复。
3.线程的堆栈
堆栈是保证线程独立运行所必须的。
线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程
堆栈是保证线程独立运行所必须的。
线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程
必须拥有自己的函数堆栈,
使得函数调用可以正常执行,不受其他线程的影
响。
4.错误返回码
由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用
后设置了errno值,而在该
线程还没有处理这个错误,另外一个线程就在此时
被调度器投入运行,这样错误值就有可能被修改。
所以,不同的线程应该拥有自己的错误返回码变量。
所以,不同的线程应该拥有自己的错误返回码变量。
5.线程的信号屏蔽码
由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自
己管理。但所有的线程都
共享同样的信号处理器。
6.线程的优先级
由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参
数,这个参数就是线程的优先级。
涉及多线程程序涉及的时候经常会出现一些令人难以思议的事情,用堆和栈分配一个变量可能在以后的执行中产生意想不到的结果,而这个结果的表现就是内存的非法被访问,导致内存的内容被更改。理解这个现象的两个基本概念是:在一个进程的线程共享堆区,而进程中的线程各自维持自己堆栈。