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

     
      返回:该线程的优先级。


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





  • 相关阅读:
    android 保存图片,及将图片更新到图库
    android 点击数字跳转到电话界面
    使用Picasso将加载的图片变成圆形
    如何获取listview里面的edittext或者RadioGroup的值,涉及到引发的混乱现象
    返回页面,并将此页面数据刷新一遍
    DrawerLayout建立侧滑时,显示侧滑页面,底层页面仍可以有点击响应,解决办法。
    实现双击退出程序
    sql语句查找某一列的值得最大值。
    vue 实战笔记一项目准备
    node的基础知识
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8310934.html
Copyright © 2020-2023  润新知