一、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()
  返回线程的优先级。

 
  返回:该线程的优先级。

三、常见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一对一的映射。

Java 线程第三版 第九章 Thread调度 读书笔记的更多相关文章

  1. Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  2. Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  3. Java 线程第三版 第八章 Thread与Collection Class 读书笔记

        JDK1.2引入最有争议性的改变是将集合类默觉得不是Thread安全性的. 一.Collection Class的概述 1. 具有Threadsafe 的Collection Class: j ...

  4. Java多线程编程核心技术-第7章-拾遗增补-读书笔记

    第 7 章 拾遗增补 本章主要内容 线程组的使用. 如何切换线程状态. SimpleDataFormat 类与多线程的解决办法. 如何处理线程的异常. 7.1 线程的状态 线程对象在不同的运行时期有不 ...

  5. 高性能MySQL(第4版) 第一章 MySQL架构 读书笔记

    这本书去年11月出的,今年中文版也出了,并且直接上了微信读书,之后有空就读一读,分享下读书笔记~ 原文内容比较充实,建议有时间可以读一下原文. 第一章主要是个概览. MySQL的逻辑架构 默认情况下, ...

  6. Java 线程第三版 第四章 Thread Notification 读书笔记

    一.等待与通知 public final void wait() throws InterruptedException      等待条件的发生. public final void wait(lo ...

  7. Java 线程第三版 第五章 极简同步技巧 读书笔记

    一.能避免同步吗? 取得锁会由于下面原因导致成本非常高:     取得由竞争的锁须要在虚拟机的层面上执行很多其它的程序代码.     要取得有竞争锁的线程总是必须等到锁被释放后. 1. 寄存器的效应 ...

  8. 0038 Java学习笔记-多线程-传统线程间通信、Condition、阻塞队列、《疯狂Java讲义 第三版》进程间通信示例代码存在的一个问题

    调用同步锁的wait().notify().notifyAll()进行线程通信 看这个经典的存取款问题,要求两个线程存款,两个线程取款,账户里有余额的时候只能取款,没余额的时候只能存款,存取款金额相同 ...

  9. “全栈2019”Java多线程第三十五章:如何获取线程被等待的时间?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. 查看oracle数据库的启动时间

    Oracle的sys用户下有个视图v_$instance,该视图只有一行数据.通过SQL语名可查询其内容: select * from sys.v_$instance 此视图可查看很多东西,如实例名, ...

  2. Math的三个取整方法。

    Math类中提供了三个与取整有关的方法:ceil.floor.round,这些方法的作用与它们的英文名称的含义相对应 1.ceil的英文意义是天花板,该方法就表示向上取整,所以,Math.ceil(1 ...

  3. 56.fread fwrite

    fwrite //初始化数组 ]; ; i < ;i++) { printf("\n%d", a[i] = i); } //以写的方式打开文件 FILE *pf = fope ...

  4. element-UI实现el-table-column百分比自定义分配

    1.把el-table-column的属性width换位min-width就支持百分比显示了.

  5. HDU4825 Xor Sum(贪心+Trie树)

    Problem Description Zeus 和 Prometheus 做了一个游戏,Prometheus 给 Zeus 一个集合,集合中包含了N个正整数,随后 Prometheus 将向 Zeu ...

  6. python运算符优先级表

    运算符 描述 lambda Lambda表达式 or 布尔“或” and 布尔“与” not x 布尔“非” in,not in 成员测试 is,is not 同一性测试 <,<=,> ...

  7. 事件循环(Event Loop)

    1.什么是事件循环? JavaScript为单线程执行的,所以是从上到下依次执行,js分为两个任务,宏任务和微任务 首先执行宏任务(第一次就是执行所有的同步代码),再执行所有的微任务,执行完毕之后再次 ...

  8. 第二十八天 月出惊山鸟 —Spring的AOP

    6月13日,阴转细雨."人闲桂花落.夜静春山空. 月出惊山鸟.时鸣春涧中." 无论在面向过程还是在面向对象里,奇妙的"纯"字,似乎永远都充满了无限的可能性.除了 ...

  9. 不安装谷歌市场,下载谷歌市场中的APK

    不安装谷歌市场,下载谷歌市场中的APK GooglePlayStore 是谷歌官方的的应用市场,有的时候还是需要从谷歌市场下载APK文件.国内的安卓手机厂商都不自带GooglePlay,甚至一些手机& ...

  10. SQLite-SQLiteDatabase 数据库实例练习

    今天趁着有时间,自己在网上找了相关的数据库操作代码,进行了一下练习,先上代码 main.xml文件 <RelativeLayout xmlns:android="http://sche ...