一、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. Django项目之Web端电商网站的实战开发(三)

    说明:该篇博客是博主一字一码编写的,实属不易,请尊重原创,谢谢大家! 接着上一篇博客继续往下写 :https://blog.csdn.net/qq_41782425/article/details/8 ...

  2. Apache-DBUtils包对数据库的操作

    •commons-dbutils 是 Apache 组织提供的一个开源 JDBC工具类库,它是对JDBC的简单封装.学习成本极低.而且使用dbutils能极大简化jdbc编码的工作量,同一时候也不会影 ...

  3. libev环境

    wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.13.tar.gz tar xzvf libsodium-1. ...

  4. node----ajax请求太大报错------解决方法

    //----分析主体程序var bodyParser = require(‘body-parser‘); app.use(bodyParser.json({limit: ‘50mb‘})); app. ...

  5. ELK之日志查询、收集与分析系统

    项目由来 (1)开发人员不能登录线上服务器查看详细日志,经过运维周转费时费力 (2)日志数据分散在多个系统,难以查找与整合 (3)日志数据量巨大,查询速度太慢,无法满足需求 (4)无法全局掌控项目运行 ...

  6. C#解决关闭多线程的form主窗体时抛出ObjectDisposedException 异常

    一.现象: 我在主窗体新建线程,使用子线程来处理接收到的数据,并且更新窗体显示内容,但关闭主窗体程序之后就程序就报错,如下所示: 二.分析问题: 由于新建线程的处理函数里边是一直死循环处理数据,虽然窗 ...

  7. Spring学习总结(8)——25个经典的Spring面试问答

    1.什么是Spring框架?Spring框架有哪些主要模块? Spring框架是一个为Java应用程序的开发提供了综合.广泛的基础性支持的Java平台.Spring帮助开发者解决了开发中基础性的问题, ...

  8. 洛谷 P1916 小书童——蚂蚁大战

    P1916 小书童——蚂蚁大战 题目背景 小A在你的帮助下,开始“刷题”,他在小书童里发现了一款叫“蚂蚁大战”(又称蛋糕保卫战)的游戏.(你懂得) 题目描述 游戏中会出现n只蚂蚁,分别有a1,a2…… ...

  9. Warning: Division by zero in 错误处理

    Warning: Division by zero in 错误处理 今天调试一段代码,结果提示 Warning: Division by zero in ,没有扫到答案,最后发现 $dir/$name ...

  10. 28. Spring Boot配置方式

    转自:https://blog.csdn.net/webzhuce/article/details/54564019