线程具有以下六种状态
1. New(新创建)
2. Runnable(可运行)
3. Blocked(被阻塞)
4. Waiting(等待)
5. Timed Waiting(计时等待)
6. Terminated(被终止)
如果要获取线程的状态请用getState()方法
用new操作符创建一个新线程时如new Thread(r) 该线程还没有被运行,这意味着这个线程的状态是new。当一个线程处于新创建状态,程序还没有开始运行线程中的代码,可以在之前进行一些基础工作
一旦调用start方法,线程处于runnable状态。一个可运行的线程可能正在运行也可能没有运行,这取决与操作系统给线程提供的时间
线程开始运行不必始终保持运行
线程被调用yiela、阻塞、等待状态时才失去控制权
多处理机上 每个处理机可以运行一个线程,线程数多与处理机数目时,调度器会采用时间片机制
要点
1. 线程处于被阻塞或等待状态时,它不活动不运行任何代码且消耗最少资源。
2. 当线程试图获取一个内部对象锁而该锁被其他线程持有则线程进入阻塞状态,当所有其他线 程释放该锁,并且线程调度器允许该线程持有它的时候,线程才变为非阻塞状态
3. 当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态
在调用�Object.wait() Thread.join()或者是等待concurrent库中的Lock和Condition会出现
4. 有几个方法有一个超时参数。调用他们导致线程进入计时等待状态,这一状态一直保持超时期满或收到适当通知
Thread.sleep() Object.wait() Thread.join() Lock.tryLock() Condition.await()
线程状态
1. 因为run方法正常退出而死亡
2. 因为一个没有捕获的异常而终止,意外死亡
void join() // 等待终止指定线程 void join(long millis) //等待指定的进程死亡或者经过指定的毫秒数 Thread.State getState() //获得指定的线程状态 void stop() //停止该线程
线程的属性包括:线程优先级、守护线程、线程组以及处理未捕获异常的处理器
Java语言中每个线程都有优先级,默认情况下一个线程继承他父亲的优先级。利用setPriority
提高或降低任何一个线程的优先级
优先级级别从1~10之间
每当线程调度器有机会选择新线程,优先选择优先级较高的线程
初级程序员习惯实现功能的正确性通过优先级,这是不对的
常用方法
void setPriority(int newPriority) //设置线程优先级 static int MIN_PRIORITY //最小优先级 static int NORM_PRIORITY //默认优先级 static int MAX_PRIORITY // 最高优先级 static void yield() //使该线程处于让步状态(同样优先级的情况下)
通过调用 t.setDaemon(true) 将线程转化为守护线程,此进程的唯一用途就是为其他线程提供服务。例如计时线程,如果虚拟机只剩下守护线程则退出程序
守护线程不去访问固有资源,如文件数据库,因为他随时可以中断
run方法不能抛出任何受查异常,非受查异常会导致线程终止
不需要任何catch处理异常,异常会被传递到 Thread.UncaughtExceptionHandler接口的类