一、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. tortoisegit--无法commit

    tortoisegit--无法提交,好几次使用tortoisegit,commit的时候出现卡死的情况,导致无法提交代码. 分析错误以为是: 电脑的性功能有关,但重启好几次电脑一人无济于事,打开任务管 ...

  2. ES6第二节:新的声明方式

    通过上一节的环境搭建完成,接下来我们就可以愉快的探索ES6的新世界了!下面我们从新的声明方式开始: 在ES6里新加了两种声明方式:let 和 const,以前我们都是用var去作声明,接下来我们一一比 ...

  3. pidof---查找指定名称的进程的进程号id号。

    pidof命令用于查找指定名称的进程的进程号id号. 语法 pidof(选项)(参数) 选项 -s:仅返回一个进程号: -c:仅显示具有相同“root”目录的进程: -x:显示由脚本开启的进程: -o ...

  4. 【2017 Multi-University Training Contest - Team 3】RXD and math

    [Link]: [Description] [Solution] 发现1010mod(109+7)=999999937; 猜测答案是nk 写个快速幂; 注意对底数先取模; [NumberOf WA] ...

  5. cocos2d-x-lua基础系列教程六(lua-table增删改查)

    lua-table库 1.插入 table.insert () --假设没有设定位置.默认last位置 样例: myTable = { 1, 2, 3 } myTable.insert(myTable ...

  6. Android 使用开源库载入网络图片

    Android 使用开源库载入网络图片,使用开源库载入图片.单击listview弹出popupwindow弹出框详情查看: Android 单击listview弹出popupwindow弹出框 ,里面 ...

  7. Asp中JSON的使用

    我对asp全然不懂,因为须要使用json的结构,就研究了一下asp的json的使用,拼接一个json的字符串. 測试用例中使用到了一个lib文件: Json_2.0.3.asp <% ' ' V ...

  8. Linux-清除rootpassword

    1.Linux进入单用户模式,通常选择内核按e 最后加入single,按b进入单用户. 2.清除/etc/shadow中root这一行第一个:符号和第二个:符号之间内容. 3.正常启动,passwd ...

  9. javascript创建对象的方法--原型模式

    javascript创建对象的方法--原型模式 一.总结 1.原型模式解决内存浪费的方法(继承):通过继承,对象继承原型模式下的所有属性,对象不同于其它对象的的属性自己创建或者修改 2.原型的使用(p ...

  10. mahout-distribution-0.9.tar.gz的安装的与配置、启动与运行自带的mahout算法

    不多说,直接上干货! 首先,别在windows下搭建什么,安装什么Cygwin啊!直接在linux,对于企业里推荐用CentOS6.5,在学校里用Ubuntu. Mahout安装所需软件清单: 软件 ...