首页 > 代码库 > Java 线程第三版 第九章 Thread调度 读书笔记
Java 线程第三版 第九章 Thread调度 读书笔记
一、Thread调度的概述
import java.util.*; import java.text.*; public class Task implements Runnable { long n; String id; private long fib(long n) { if (n == 0) return 0L; if (n == 1) return 1L; return fib(n - 1) + fib(n - 2); } public Task(long n, String id) { this.n = n; this.id = id; } public void run() { Date d = new Date(); DateFormat df = new SimpleDateFormat("HH:mm:ss:SSS"); long startTime = System.currentTimeMillis(); d.setTime(startTime); System.out.println("Starting task " + id + " at " + df.format(d)); fib(n); long endTime = System.currentTimeMillis(); d.setTime(endTime); System.out.println("Ending task " + id + " at " + df.format(d) + " after " + (endTime - startTime) + " milliseconds"); } }
Runnable的实现类以便可以用多个Thread来运行多个实例。
import javathreads.examples.ch09.*; import javathreads.examples.ch09.*; public class ThreadTest { public static void main(String[] args) { int nThreads = 3; long n = 20; Thread t[] = new Thread[nThreads]; for (int i = 0; i < t. length; i++) { t[i] = new Thread( new Task(n, "Task " + i)); t[i].start(); } for (int i = 0; i < t. length; i++) { try { t[i].join(); } catch (InterruptedException ie) {} } } }
执行结果:
Starting task Task 1 at 07:06:24:443 Starting task Task 0 at 07:06:24:443 Starting task Task 2 at 07:06:24:443 Ending task Task 2 at 07:06:24:446 after 3 milliseconds Ending task Task 0 at 07:06:24:446 after 3 milliseconds Ending task Task 1 at 07:06:24:446 after 3 milliseconds
从以上结果可以看出,线程的执行并不是按照启动的顺序依次执行。
二、以Thread优先级来调度
Java虚拟机中线程的四种状态:
Initial 一个线程对象从它创建起到该对象的start方法被调用为止这个时间段处于initial状态。
Runnable start方法执行后,处于这种状态。
Blocked 不能运行因为它在等待某个特定的事件发生。
Exiting run方法执行完成。
将Thread调用程序想象成Linked list来保存它所操作的所有Thread的记录,每个Thread都在描述该Thread状态的list上上。Java Thread有11种优先级,所以可以想象14个Linked list(包括出去exiting之外三种状态各一个)。
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。每个线程都可以或不可以标记为一个守护程序。当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
优先级异常
有两种情况下虚拟机会选择优先级低的而不是优先级高的。
优先级逆转
优先级为8的Thread需要取得优先级为2的Thread锁持有的锁,最后会以优先级等效为3的等级来运行。可以通过优先级继承来解决。
复杂的优先级:
Java指定Thread优先级的计算公式:RealPriority = JavaPriority + SecondsWaitingForCPU
以Thread优先级来调度:
public final void setPriority(int newPriority)
更改线程的优先级。
首先调用线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException。
在其他情况下,线程优先级被设定为指定的 newPriority 和该线程的线程组的最大允许优先级相比较小的一个。
public final int getPriority()
返回线程的优先级。
返回:该线程的优先级。
更改线程的优先级。
首先调用线程的 checkAccess 方法,且不带任何参数。这可能抛出 SecurityException。
在其他情况下,线程优先级被设定为指定的 newPriority 和该线程的线程组的最大允许优先级相比较小的一个。
public final int getPriority()
返回线程的优先级。
返回:该线程的优先级。
三、常见Threading的实现
Green Thread 这种模式操作系统完全不知道有关Java Thread的任何事情,由虚拟机来处理所有Thread API细节。
更多信息详见:Green threads
Windows 固有的Thread
32位Windows操作系统对于虚拟机所使用的多个Thread拥有完全的管辖权,且Java Thread与操作系统Thread有一对一的关系。操作系统使用复杂优先级的计算来决定哪个Thread应该是当前运行中的Thread。
Linux的固有Thread
直道JDK 1.3为止,Linx上的虚拟机都尝试使用Green Thread模式。JDK 1.3加入对Linux固有Thread的支持。
新的Linux内核使用Native Posix Thread Library,提供了其他操作系统所看到的Java Thread 与 Kernel Thread一对一的映射。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。