请登录
四川成人和教育管理有限公司 - 笔记串讲 - 工学类 - 4747Java语言程序设计(一) - 浏览文章

4747自考Java语言程序设计(一)最新串讲笔记(自考小抄)8

2016/5/31 10:14:210人浏览0评论

第8章            多线程

1. 线程的基本概念(课本159-160页)

?Java程序中,多任务是通过多线程实现的。

?多任务是一种在单个程序里同时执行多项任务的技术。在Java中,通过给每个任务一个独立的执行线程,从而形成了多线程的并行程序。

?一个CPU一次只能执行一条机器指令,通过在线程之间快速的切换,就可以并行的运行多个线程。

?通过调度技术将CPU时间在各个线程之间分享,就可以实现多线程的程序。在不同的操作系统中,处理线程调度有不同的解决方案。

?常用的一种调度技术为时间分片,在某种调度算法的控制下,每个线程得到一小片CPU时间。

轮循调度 :每个线程分到一个相等的时间片,并且遵循先来先服务的原则。

优先级调度 :更高优先级的线程可以在低优先级线程运行之前先运行。

1)线程的生命周期(课本159-160页)

线程的生命周期

?新建-> 就绪-> 运行-> 阻塞-> 死亡

?Thread

?Start()

?Run()

?Sleep  wait

?Resume  notify  notifyAll

2)线程调度与优先级(课本160页)

?每个Java程序都有一个默认的主线程,就是通过JVM启动的第一个线程。

对于应用程序,主线程执行main()方法。

对于Applet,主线程是指浏览器加载并执行小应用程序的那一个线程。

?守护线程(Daemon)是一种监视其他线程工作的服务线程,具有最低的优先级。

2. Thread类和Runnable接口            (课本161-165页)

?在程序中创建线程的方法通常有两种:

(1) 创建Thread的一个子类,并重写run()方法,创建此子类的对象作为线程对象。

(2) 定义实现Runable接口的类(即在类中实现run()方法),创建此类的对象并将其作为实参传给Thread类的构造方法Thread(Runnable target),从而创建线程对象。

1Thread类(课本161-163页)

?常用成员方法:

public final String getName()// 返回该线程的名称。

public final void setName(String name)// 设置线程名称为name

public final int getPriority()// 返回线程的优先级。

public final void setPriority(int newPriority)

// 设置线程的优先级为newPriority,常用取值为常量:

MAX_PRIORITY(10): 线程可以具有的最高优先级。

MIN_PRIORITY(1): 线程可以具有的最低优先级。

NORM_PRIORITY(5): 分配给线程的默认优先级。 

?常用成员方法:

public static Thread currentThread()

// 返回对当前正在执行的线程对象的引用。

public final boolean isAlive()

// 测试线程是否处于活动状态。如果该线程处于活动状态,则返回 true;否则返回 false。如果线程已经启动且尚未终止,则为活动状态。

?用于线程控制的成员方法:

public void start()

// 使该线程开始执行,先完成所有和系统相关的初始化任务,再由JVM调用该线程的run()方法;

public void run()

// 封装了线程的基本算法,通常不会被直接调用,而是由线程的start()方法调用它。

public static void sleep(long millis) throws InterruptedException

// 在指定的毫秒数millis内让当前正在执行的线程休眠(暂停执行),当休眠时间结束,重新回到就绪队列中排队。

public static void yield()

// 暂停当前正在执行的线程对象,并执行其他线程,暂停的线程重新等待被调度;

 

程序实例(见课本162页)

2Runnable(课本163-165页)

在小应用程序中使用Runnable接口实现多线程的步骤:

(1) 声明实现Runnable接口的类,并在类中实现run()方法;

(2) 在类中声明新线程,在init()方法或start()方法中使用Thread类的构造方法Thread(Runnable target)创建线程对象,并在start()方法中启动新线程。

补充:产生随机数

?Math.random( )方法用于产生一个[01)区间内的随机double值,并且在上述范围内大致均匀分布。

                     0.0 <= Math.random( ) < 1.0

?要随机产生一个在[M, M+N-1]范围内的整数值,一般形式如下:

                  M + ( int ) ( Math.random( ) * N )

例如:int die = 1 + ( int ) ( Math.random( ) * 6 )

程序实例(见课本163页)

?8.2

?8.3

3. 线程互斥和同步(课本161-165页)

线程的行为是异步的,无法预测一个线程什么时候可能被中断或让出CPU给其他线程。

当涉及协调多个线程协作的应用程序中,很重要的一点是,设计应当具有防范因异步而导致问题的能力。

(1)        线程互斥(课本166-168页)

一些同时运行的线程需要共享某些数据,为保证数据操作的完整性,线程之间需要互斥。

程序实例(见课本166页)例8.4

?临界段:指一个线程执行中不应该被中断的部分。加锁机制。

?在多线程累加求和的例子中,取得当前结果并将其与50求和的新结果存回的过程是不该被中断的临界段。

?Synchronized限定符也可以用于指定一个方法为关键段,这样就使得这个方法的执行不能被其他的合作线程抢占。

程序实例(见课本167-168页)

?设置临界段实现线程互斥后的例8.4

 

(2)        线程同步(课本168-171页)

当线程A使用到某个对象,而此对象又需要线程B修改后才能符合本线程的需要,这时线程A要等待线程B完成修改工作。线程相互等待称为线程的同步。

?线程同步地实现使通过类java.lang.Object中定义的成员方法:

public final void wait() throws InterruptedException

// 导致当前线程等待,直到其他线程调用此对象的notify()notifyAll()方法。

public final void wait(long timeout) throws InterruptedException

// 导致当前线程等待,直到其他线程调用此对象的notify()notifyAll()方法,或超过指定时间量。

public final void notify()

// 唤醒在此对象监视器上等待的单个线程,使其回到就绪队列;

public final void notifyAll()

// 唤醒在此对象监视器上等待的所有线程,使其回到就绪队列。

程序实例(见课本168页)例8.5

关键字:
网友评论