1、简介
多线程技术属于操作系统范围内的知识;
进程与线程
可以这么理解,一个应用程序就是一个进程,在一个进程中包含至少一个线程;进程就是线程的容器,真正工作、处理任务的是线程。
进程是操作系统分配资源的基本单位;线程是操作系统进行调度,时间分配的基本单位;
进程由内核对象和地址空间两部分构成,内核对象就是一小块记录进程信息的内存,只允许操作系统访问;地址空间就是存放数据和程序的空间;
2、多线程运行机制
对于单个CPU,在每个时间点只能只能执行一个线程,多线程的实现是基于对时间片的轮回机制的,即为每一个线程分配一个极短的时间片;时间片结束了就执行另一个线程,关于时间片的分配是由操作系统完成的,应用程序无法改变。应用程序可以设置线程的优先级。
关于线程的优先级,对于windows操作系统,线程的优先级是根据所在进程的优先级类和线程的相对优先级类进行确定的,方法如图:
注意,进程优先级一般不要设置为real-time会出问题的。
然后说一下优先级的作用,优先级越高,分配的时间片越长;优先级不等同于执行顺序,线程的执行顺序受操作系统的很多因素影响,优先级只可能是其中的一个因素,所以指望利用优先级控制线程的执行顺序是不现实的。
另外不同语言对优先级的规定也不同,而且优先级适合操作系统和平台相关的,利用优先级控制程序,在一个平台中运行很好,而在另一个平台中就可能会出问题。
3、线程的生命周期(基于Java语言)
new(创建线程)、run/start(执行线程)、block(阻塞线程)、wait(释放锁,并等待唤醒)、destroy(死亡)
对于run和start 尽量选择用start ,因为虽然run是线程真正的处理程序,但是调用run就相当于调用了一个方法,run不结束,是不会执行后面的语句的;而调用start会自动调用run,并且无论run是否运行完毕,都会执行后面的程序,这才是真正意义上启动一个线程;
4、基于Java 多线程的实现
基于Java实现多线程有两种方式,一个是通过继承thread类,另一个是继承runnable接口;两种方式本质上没有太多区别,因为thread类本身也是继承了Runnable接口的,只不过在进行了一些封装而已。两种方式在使用上是由区别的,如果一个类已经继承了其他类,便不能再集成thread类了,所以只能使用第二种方法。
继承于thread类的类,可以直接调用thread的方法;
大概是这样的
public class testThread1 extend Thread { /** *重写run方法 */ public void run() { } } //调用方式 testThread1 threadInstance = new testThread1 (); threadInstance.start(); //自动执行run方法