1.1.2获取和控制线程状态(Getting and Seeting Thread State)


一个线程对象联合着一个线程的状态。这个状态包含着一个名字、一个表明线程是活着还是死着、执行线程的状态(它是否在执行?)、线程的优先权、声明线程是守护进程还是非守护进程。

1.1.2.1获取和控制一个线程的名字(Getting and Setting a Thread’s Name)

一个Thread对象拥有一个名字,这个名字有利于我们代码打断点。除非这个名字是一个特殊的声明,不然一个默认的名字是带有“Thread-”开头的。你可以通过请求Thread的String getName()的方法获取名字。为了设置线程的名字,你可以通过构造器,例如Thread(Runnable r,String name),或者请求Thread的voidsetName(String name)方法。参考如下的代码片断:

Thread t1 = new Thread(r, "thread t1");
System.out.println(t1.getName()); // Output: thread t1
Thread t2 = new Thread(r);
t2.setName("thread t2");
System.out.println(t2.getName()); // Output: thread t2

       Note : Thread的long getId()方法返回一个唯一的长整型的线程名。这个数字在线程存活期间保持不被改变。

1.1.2.2获得一个线程存活状态(Getting a Thread’s Alive Status)

你可以请求Thread的booleanisAlive()的方法来判断一个线程是存活还是死亡。如果线程是存活着,那么将会返回true,其它情况将会返回false。一个线程的生命周期范围是,从它开始是运行start()方法期间内到它离开了run()的方法,之后它就死亡了。下面的代码片断创建一个新的线程。然后输出线程是存活或是死亡。

Thread t = new Thread(r);
System.out.println(t.isAlive()); // Output: false 
1.1.2.3获得线程执行状态(Getting a Thread’s Execution State)

一个线程拥有一个执行状态,通过Thread.State的枚举常量来定义的:

1)        NEW:尚未启动的线程处于这个状态。

2)        RUNNABLE:在Java虚拟中执行的线程处于这个状态。

3)        BLOCKED:线程因阻塞而等待一个监测器的锁,处于这个状态。

4)        WAITNG:一个线程正在无限期等待另一个执行一个特定的操作。

5)        TIMED_WAITING:正在等待另一个线程执行指定等待时间的操作的线程处于该状态。

6)        TERMINATED:线程结束处于该状态。

通过Thread.StategetState()的方法可以明确一个应用的当前线程状态,如下的代码片断:

Thread t = new Thread(r);
System.out.println(t.getState()); // Output: NEW
1.1.2.4获得和控制线程权限(Getting and Setting a Thread’s Priority)

当一台电脑有足够的处理器和(或)处理器核时,电脑的操作系统会使分开的线程处于每一个处理器或核中,以至于多个线程可以同时进行。如果电脑没有足够的处理器或处理器核的时间,那么多个线程必须处于等待其它线程处理好了之后返回才可进行。

       Note 明确处理器或处理器核的数量,通过java.lang.Runtime类的intavailableProceddors()方法去设置Java虚拟机的变量。这个可以在Java虚拟中执行,它不能小于1。

操作系统会使用一个调度程序表去确认什么时候让等待的线程执行。下面列表确认三个不同的调度程序列表:
       

1)        Linux2.6到2.6.23的版本使用O(1)调度程序列表。

2)        Linux2.6.23也使用完全公平的调度程序列表。

3)        Windows NT-基础的操作系统(如NT,XP,Visa和7)使用多水平的反应调度程序列表。这个调度程序列表过去只适用于Windows Visa和Windows 7。

一个多水平的反应队列和多个其它线程调度程序列表将优先考虑(线程相对重要性)。它们经常结合着优先权的列表(高优先权将会抢占——打断和取代低优先权的线程)。

线程提供intgetPriority()的方法获取优先权的级别,它将会返回当前优先权的级别。通过void setPriority(int priority)的方法,可以放入priority的优先权。priority的值的范围是从Thread.MIN_PRIORITY到Thread.MAX_PRIORITY,Thread.NORMAL_PRIORITY是明确默认的优先权。思考如下的代码片断:

Thread t = new Thread(r);
System.out.println(t.getPriority());
t.setPriority(Thread.MIN_PRIORITY);

Caution 使用setPriority()会在操作系统中影响着应用的可移植性,因为不同的调度程序列表会通过不同的方式来操作优先权改变。例如,一个操作系统的调度程序列表可能会延迟低优先权线程的执行直到高优先权的线程执行完。这个延迟会导致无限期的延迟或饥饿状态,因为低优先权的线程在无限期的等待时针对“饥饿”,为了可以得到执行,这样就会严重的影响到应用的性能。其它的操作系统可能不会无限期的延迟低优先级的线程,为了提高应用系统性能。

1.1.2.5获得和控制线程的守护进程状态(Getting and Setting a Thread Deamon Status)

    Java让你的典型线程作为守护线程和非守护线程。一个守护线程是一个线程,它的主要作用是作为非守护线程的帮助者,当应用的非守护线程死亡而导致应用的结束时,守护线程也会自动死亡。

你可以决定一个线程是守护线程还是非守护线程,通过请求Thread的boolean isDaemon()的方法,对于守护线程将会返回true:

 Thread t = new Thread(r);
System.out.println(t.isDaemon()); // Output: false

默认的线程是连接着Thread的对象,是非守护线程。为了去创建一个守护的线程,你可以使用Thread的void setDeamon(Boolean isDeamon)的方法,设置isDeamon为true。看如下的代码片断:

 Thread t = new Thread(r);
t.setDaemon(true);
Note:当应用的主线程为非守护线程,那么所有后台的非守护线程结束了应用也不会结束。如果后台执行的线程为守护线程,那么默认的线程结束了应用将会结束。

  源码下载:git@github.com:owenwilliam/Thread.git



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值