标签:
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方法
继承于runnable接口的类,必须实例化后,然后用实例化后的对象初始化一个thread对象;
大概是这样的
public class testThread2 implements Runnable { /** *重写run方法 */ public void run() { } } //调用方式 testThread2 threadInstance = new testThread2 (); Thread real_threaInstance = new Thread(threadInstance ); real_threaInstance .start(); //自动执行run方法
本质上都是对runnable的run方法进行重写,run中的函数就是线程要执行的函数。
5、基于Java的多线程通信
多线程之间的通信自己分类,分为三种:(1)共享变量 (2)消息机制 (3)管道机制(暂时不了解还)
(1)共享变量
各个线程共享进程的地址空间,所以就都可以访问进程中的公共地址空间,这样在公共地址空间中的变量就可以被各个线程访问;如果进程中的地址空间被分配给某个线程,那么其他线程就不可以访问了。
(2)消息机制
主要介绍sleep join wait notify synchronized的应用
synchronized:为obj对象加锁,调用方法 synchronized(obj){} //obj是一个对象 只要继承于object类即可 如: string类型 在Java中,每一个继承于object类的对象都有一个琐,当对这个对象枷锁之后,其他线程便不能够再访问这个对象了;
sleep:使线程休眠一定的时间,在休眠过程中不是释放锁
wait: 有两种调用方式 wait(1000) //指定休眠时间 wait() //不指定休眠时间,在休眠过程中 会释放锁;wait() 必须放在synchronized代码块中,因为只有加锁之后,才可以释放锁,释放的就是synchronized(obj) obj的锁;否则就会报异常;
notify:唤醒一个wait线程
标签:
原文地址:http://www.cnblogs.com/tengpan-cn/p/4824309.html