线程信息的获取和设置

一、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的高级工具类也使用了线程工厂创建线程。

 

posted @ 2017-11-21 17:12  牛头人  阅读(1931)  评论(0编辑  收藏  举报