您的位置:首页 > 编程语言 > Java开发

Java核心技术卷1 第十四章 多线程

2016-07-02 21:55 387 查看
14.1 什么是线程

一个程序同时可以执行多个任务。通常,每一个任务称为一个线程,可以同时运行一个以上线程的程序称为多线程程序。

多进程与多线程的区别:

每个进程拥有自己的一整套变量,而线程则共享数据。听起来有些危险。

然而,共享变量使线程之间的通信比进程间通信更有效,更容易。

与进程相比,线程更轻量级,创建,撤销一个线程比启动新进程的开销要小的多。

Thread.sleep();调用这个Thread类的静态方法,不会创建一个新线程,用于暂停当前线程的活动。

使用线程给其他任务提供机会

可以将耗时任务,移动球的代码放置在一个独立的线程中。可以提高其响应能力,实际,可以发起多个球,都运行在自己的线程中。

14.2 中断线程

当线程的run方法执行方法体中最后一条语句后,并经由执行return语句返回时,或出现了在方法中没有捕获的异常时,线程将终止。

强制终止线程:

有一种可以强制线程终止的方法,interrupt方法可以用来请求终止线程。

当对一个线程调用interrupt方法时,线程的中断状态将被置位。这是每一个线程都具有的boolean标志。每个线程都应该不时地检查这个标志,以判读线程是否被中断。

要弄清中断状态是否被置位,

首先调用静态的Thread.currentThread方法获得当前线程,然后调用 isInterrupted方法。

while(!Thread.currentThread().isInterrupted()){

do more work

}

如果线程被阻塞,就无法检测中断状态。

14.3 线程状态

New 新创建 Runnable 可运行 Blocked 被阻塞 Waiting 等待 Timed waiting 计时等待 Terminated 被终止

要确定一个线程的当前状态,可调用 getState方法。

1、新创建线程

当用new操作符创建一个新线程时,如new Thread() ,该线程还没有开始运行。

2、 可运行线程

一旦调用 start方法,线程处于 runnable状态。一个可运行的线程可能正在运行也可能没有运行。这取决于操作系统给线程提供运行的时间。一个正在运行的线程仍然处于可运行状态。

一旦一个线程开始运行,他不必始终保持运行。事实上,运行中的线程被中断,目的是为了其他线程获得运行机会。线程调度的细节依赖于操作系统提供的服务。

抢占式调度系统给每一个可运行线程一个时间片来执行任务。当时间片用完,操作系统剥夺该线程的运行权,并给另一个线程运行机会。当选择下一个线程时,操作系统考虑线程的优先级。

桌面及服务器操作系统都使用抢占式调度。Android也采用该模式,基于线程优先级来决定CPU的使用权。

3.被阻塞线程和等待线程

当线程处于被阻塞或等待状态时,它暂时不活动。它不运行任何代码且消耗最少的资源。直到线程调度器重新激活它。细节取决于它是怎样达到非活动状态的。

当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态。当所有其他线程释放该锁,并且线程调度器允许本线程持有它的时候,该线程将变成非阻塞状态。

当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。被阻塞状态与等待状态有很大不同。

有几个方法有一个超时参数。调用它们导致线程进入计时等待状态。这一状态一直保持到超时期满或接收到适当的通知。带有超时参数的方法有 Thread.sleep和

Object.wait, Thread.join , Lock.tryLock及 Condition.await的计时版。

当一个线程被阻塞或等待时,另一个线程被调度为运行状态。当一个线程被重新激活,调度器检查它是否具有比当前运行线程更高的优先级。如果是,调度器从当前运行线程中挑选一个,剥夺其运行权,选择一个新的线程运行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息