Note of Chap10

来源:互联网 发布:整站排名优化 编辑:程序博客网 时间:2024/05/20 23:03
Note of Chap10: 
线程:
小进程,是控制线程的缩写。
是程序运行的基本单位。
是具有一定顺序的指令序列、存放方法中定义局部变量的栈和一些共享数据。
创建线程:派生Thread和实现Runnable  
等待、休眠、唤起线程。

多线程:
是指一个程序可以同时运行多个任务,每个任务由一个单独的线程来完成。即:多个线程可以同时在一个程序中运行,并且每个线程完成不同的任务。
可提高程序运行的效率和处理速度。
交互性能,实时控制性能。
java三大特征之一。另二:继承,多态。

Thread创建线程步骤:
创建新的线程类,继承Thread并覆盖Thread类的run()方法;
创建一个线程类对象,new;
启动新线程对象,调用start()方法;
线程自己调用run()方法。

Runnable创建线程步骤:
创建新的线程类,实现Runnable接口并重写run()方法;
创建一个Runnable实例,new;
通过Runnable实例创建一个线程类对象,new 带参数构造函数;
启动新线程对象,调用start()方法;
线程自己调用run()方法。

线程赛跑:多线程中,java线程并不能按调用顺序执行,而是并行执行的单独代码。可通过判断当前线程是否终止以得到预期结果。

start()方法和run()方法:
调用线程的run()方法是通过启动线程的start()方法来实现的。调用start()方法后,系统自动调用run()方法,start()方法不会run()方法执行完毕等待就返回了、

线程周期(线程四态):
创建状态:new创建线程对象,无法执行。start启动,stop停止
可运行状态:具有可运行条件,不一定处于运行状态。优先级和调度。yield
不可运行状态:线程sleep、wait被挂起或阻塞。、notify返回可运行状态。
退出状态:自然停止。

四态的转换
进入可执行状态:notify(),notifyall();sleep();I/O操作的完成;
进入不可执行状态:wait();sleep();等待I/O操作的完成;

等待线程结束:
判断线程可运行态或不可运行态:isAlive();join()

线程调度:
当多个线程交替抢占CPU时,优先级高的线程占用的时间应该多。高优先级的线程执行的效率高,执行速度也会快些。
在Java中,CPU的使用通常是抢占式调度模式,不需要时间片分配进程。
抢占式调度模式是: 多线程同时处于可运行状态,但只有一个线程正在运行。
当线程一直运行直到结束,或者进入不可运行状态,或者具有更高优先级的线程变为可运行状态,它将会让出CPU。
线程具有相同的是优先级,交互占用CPU,宏观上处于并行状态。
修改优先级,基本上优先级较高的优先抢占了CPU资源。


线程同步:
线程异步模式下,同一时刻有一个线程在修改共享数据,另一个线程在读取共享数据。当修改共享数据的线程没有处理完毕,读取数据的线程肯定会得到错误的结果。采用多线程的同步控制机制,当处理共享数据的线程完成处理数据之后了,读取线程读取数据。
第一个线程第2个线程交替对共享数据进行操作,线程不同步导致错误,运用锁机制实现线程的同步。
eg: 火车票售票。

锁机制的原理:

每个线程进入共享代码之前获得锁,否则不能进入共享代码区,并且在退出共享代码之前释放锁。解决了共享代码的情况,达到线程同步的目的。

在共享代码前加入synchronized关键字。

同步模型监视器:
为每个具有同步代码的对象准备唯一的一把“锁”。当锁个线程访问对象时,只有取得锁的线程才能进入同步方法,其他访问共享对象的线程停留在对象中等待,如果获得锁的线程调用wait方法放弃锁,它将执行同步方法,而其他没有获得锁的线程仍然继续等待获得锁。


Java程序中线程之间通过消息实现相互通信,wait,notify,notifyall方法可完成线程间消息的传递。

eg:一个对象包含synchronized同步方法,同一时刻只能有一个获得锁的线程访问该对象中的同步方法,其他线程被阻塞在对象中等待获得锁。当线程调用wait方法可使该线程进入阻塞状态,其他线程调用notify或notifyall方法可唤醒该线程。利用同步快实现两个线程的同步问题,声明了两个线程,并且在run方法中包括同步块,当程序启动线程1之后,线程1获得对象的锁,直到线程1执行结束后,线程2才能获得对象的锁,并继续运行。


线程通信:
Java中每个对象内部不仅有一个对象锁之外,还有一个线程等待队列,这个队列用于存放所有等待对象锁的线程。


生产者/消费者
必须先有生产者生产数据才能有消费者消费共享数据。
程序必须保证在消费者消费之前,必须有共享数据,否则消费者必须等待产生新的共享数据。
1. 生产者生产前,若无共享数据被消费,则生产者等待;生产者生产后,通知消费者消费;
2. 消费者消费前,若无共享数据可消费,则消费者等待;消费者消费后,通知生产者生产。、


共享队列:
保存生产者生产,消费者消费的共享数据。
共享队列两个域:value,isEmpty.共享队列提供了put和get方法。
wait 方法调用的前提条件是:当前线程获取了这个对象的锁,即:wait方法必须放在同步块或者同步方法之中。

死锁:
由于两个线程都在等待对方各自拥有的锁的现象称为死锁。
这种现象往往是相互嵌套的synchronized代码段造成,程序中应少用嵌套的synchronized代码块。

程序设计中不要使用stop,suspend,resume,destroy方法,防止出现死锁:
stop:解除由该线程获得的所有的对象锁,且可能使对象处于不连贯状态,若其他线程访问对象,导致的错误很难检查出来;
suspend,resume:线程会停下来,但是线程并没有放弃对象的锁,导致其他线程不能获得对象锁。
destroy:终止线程,但该线程不会释放对象锁。


小结:
Java通过多线程技术共享系统资源,线程间的通信与协同通过简单的方法调用完成。
对多线程的支持增强了Java作为网络程序设计语言的优势,为实现分布式应用系统中多用户并发访问,提高服务器效率奠定了基础。



0 0
原创粉丝点击