zoukankan      html  css  js  c++  java
  • 线程信息的获取和设置

    一、thread类有一些保存信息的属性,这些属性可以用来标识线程,显示线程的状态或者控制线程的优先级。

    1.ID:保存了线程的唯一标识符

    2.Name:保存了线程的名称

    3.Priority:保存了线程对象的优先级。线程的优先级是从1到10,其中1是最低优先级,10是最高优先级。

    4.Status:保存了线程的状态。线程的状态有6种:new、runnable、blocked、waiting、time waiting或者terminated。

    二、线程的中断

    1.Thread类中的isInterrupted()方法

    2.Thread类的静态方法interrupted()方法

    isInterrupted()方法和interrupted()方法的区别是:isInterrupted()方法不能改变interrupted属性的值,但是interrupted()方法能设置interrupted属性为false。因为interrupted()方法是一个静态方法,更推荐使用isInterrupted()方法。

    三、线程的休眠

    线程休眠可以调用Thread类的静态方法sleep(long millis),该方法参数单位为毫秒。

    另外一种方式是通过TimeUnit枚举类来使用Thread类的sleep()方法,但是它接收的参数单位是秒,最终被转为毫秒。

    四、等待线程的终止

    在一些情况下,我们必须等待线程终止后,在执行其他任务,这时候我们使用Thread类的join()方法。

    当一个线程对象的join()方法被调用时,调用它的线程将被挂起,直到这个线程对象完成它的任务。

    java提供了另外两种形式的join()方法:参数单位毫秒和纳秒

    join(long milliseconds)

    join(long milliseconds,long nanos)

    五、守护线程

    守护线程的优先级很低,通常来说,当同一个应用程序里没有其他的线程运行时候,守护线程才运行。当守护线程是程序中唯一运行的线程时,守护线程执行结束后,JVM也就结束了这个程序。

    Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。
    User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。
    值得一提的是,守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。下面的方法就是用来设置守护线程的。

    Thread daemonTread = new Thread();  
    // 设定 daemonThread 为 守护线程,default false(非守护线程)  
    daemonThread.setDaemon(true);  
    // 验证当前线程是否为守护线程,返回 true 则为守护线程  
    daemonThread.isDaemon();   
    setDaemon()方法只能在start()方法被调用之前设置。一旦线程开始运行,将不能再修改守护状态。
    isDaemon()方法被用来检查一个线程是不是守护线程,返回值为true表示这个线程是守护线程,false表示这个线程是用户线程。

    六、线程局部变量的使用

    ThreadLocal为每个使用该变量的线程分配一个独立的变量副本。所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。
    1、ThreadLocal不是线程,是线程的一个变量,你可以先简单理解为线程类的属性变量。
    2、ThreadLocal在类中通常定义为静态变量。
    3、每个线程有自己的一个ThreadLocal,它是变量的一个“拷贝”,修改它不影响其他线程。
    ThreadLocal适用于资源共享但不需要维护状态的情况,也就是一个线程对资源的修改,不影响另一个线程的运行;这种设计是‘空间换时间’,synchronized顺序执行是‘时间换取空间’。
    四个核心方法说明如下:
    T get():返回此线程局部变量的当前线程副本中的值。
    protected T initialValue():返回此线程局部变量的当前线程的“初始值”。
    void remove():移除此线程局部变量当前线程的值。
    void set(T value):将此线程局部变量的当前线程副本中的值设置为指定值。

    七、线程的分组

    Java Concurrent API中提供了对线程进行分组管理的ThreadGroup,使得我们可以将多个线程看作一个单元,对这些线程执行操作,如中断一组线程等。

    ThreadGroup类有很多方法,它的API文档提供了所有的方法的完整解释。

    八、线程工厂类

    工厂模式是面向对象编程中最常使用的模式之一。它是一个创建者模式,使用一个类为其他的一个或者多个类创建对象。当我们要为这些类创建对象时,不需再使用new构造器,而使用工厂类。
    使用工厂类,可以将对象的创建集中化,这样做有以下的好处:
    1、更容易修改类,或者改变创建对象的方式;
    2、更容易为有限资源限制创建对象的数目。例如,我们可以限制一个类型的对象不多于n个。
    3、更容易为创建的对象生成统计数据。
    Java提供了ThreadFactory接口,这个接口实现了线程对象工厂。Java并发API的高级工具类也使用了线程工厂创建线程。

  • 相关阅读:
    Oracle完全卸载
    Oracle数据库(64位) 及 PLSQL(64位)的组合安装【第一篇】
    Yii2 配置yii2redis扩展
    php 获取每个汉字的拼音首字母
    linux 安装memcacheq
    php在linux中执行外部命令
    比较两个日期的时间差精确到秒
    mysql 的 备份与还原
    php类中__get和__set的用法
    yii2.0 安装
  • 原文地址:https://www.cnblogs.com/web424/p/7874202.html
Copyright © 2011-2022 走看看