关于Java中的线程

>>概念:
线程是一个程序内部的顺序控制流
==>一个线程代表着程序内的一个顺序控制流

>>线程和进程的比较:
每个进程都有独立的代码和数据空间(进程上下文),进程切换的开销大。
线程:轻量的进程,同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换的开销小
      ==>对应到JVM中,就是线程有三部分:程序计数器、vmStack、NativeMethodStack,而heap和MethodAreas是所有线程共享的
多进程:在操作系统中能同时运行多个任务(程序)
多线程:在同一应用程序中有多个顺序流同时执行

>>线程的概念模型
1. 虚拟的CPU,由java.lang.Thred类封装和虚拟;
2. CPU所执行的代码,传递给Thread类对象;
3. CPU所处理的数据,传递给Thread类对象;

>>创建线程的两种方式:实现Runnable接口,继承Thread类
比较:
实现Runnable接口
可以将CPU,代码和数据分开,形成清晰的模型;
线程体run()方法所在的类还可以从其他类继承一些有用的属性和方法
有利于保持程序风格的一致性

继承Thread类
Thread子类无法再从其他类继承
编写简单,run()方法的当前对象就是线程对象,可直接操纵

【vip】当一个程序的用户线程全部结束后,即使后台线程的逻辑处理未结束,后台线程也会结束。
==>一个Java进程由用户线程和后台线程构成,当所有的用户线程都结束时,整个Java进程就会退出。


>>线程状态:==>体现线程的生命周期
新建
可运行
等待 ==>线程无限等待下去,需要其他线程调用notifyAll(),
超时等待 ==>线程等待指定的时间后,就恢复或者尝试获取cpu时间片
阻塞
终止
==>New || Runnable || Waiting || Timed-Waiting || Blocked || Terminated
==>因此分析死锁时,要注意看三种状态:waiting、timed-waitting、blocked,
==>重点看waiting和blocked
==>调用以下方法可导致线程进入waiting状态:Object.wait() || Thread.join() || LockSupport.park() ==>都没有指定具体等的时间

>>线程优先级:
默认为5,最小为1,最大为10,不提供优先级低的在优先级高的执行结束后执行
==>不保证严格的优先级顺序


>>线程操作方法
线程串行化
join()
线程休眠
sleep()
线程让步
yield() 时间片没用完就让步给其他线程尽早执行,当前线程进入就绪状态
线程的挂起和恢复
线程挂起-暂时停止当前运行中的线程,使之转入阻塞状态,并且不会自动恢复运行。
线程恢复-使得一个已挂起的线程恢复运行
suspend()
resume()


>>临界资源问题
并发线程有机的交替,确保共享的数据在关键的时段被专用
多个线程间共享的数据称为临界资源
在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性
每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任何一个时刻,只能有一个线程访问该对象
关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能有一个线程访问
并发运行的多个线程彼此间等待,都无法运行的状态称为线程死锁

>>线程同步通信
为避免死锁,在线程进入阻塞状态时应尽量释放其锁定的资源,以为其他的线程提供运行的机会
wait()
notify()/notifyAll()

>>线程间数据传输
使用管道流
类的同步性与线程安全
************************************************

猜你喜欢

转载自can-do.iteye.com/blog/2245299