android 线程的状态
来源:互联网 发布:开源销售管理系统 php 编辑:程序博客网 时间:2024/06/11 00:12
1,线程
1.1线程的状态
线程在它的生命周期中可能处于以下几种状态之一:
· New(新生):线程对象刚刚被创建出来;
· Runnable(可运行):在线程对象上调用start方法后,相应线程便会进入Runnable状态,若被线程调度程序调度,这个线程便会成为当前运行(Running)的线程;
· Blocked(被阻塞):若一段代码被线程A”上锁“,此时线程B尝试执行这段代码,线程B就会进入Blocked状态;
· Waiting(等待):当线程等待另一个线程通知线程调度器一个条件时,它本身就会进入Waiting状态;
· Time Waiting(计时等待):计时等待与等待的区别是,线程只等待一定的时间,若超时则不再等待;
· Terminated(被终止):线程的run方法执行完毕或者由于一个未捕获的异常导致run方法意外终止会进入Terminated状态。
1.2 线程的优先级
· 每个线程都有一个优先级,默认情况下,线程会继承它的父线程的优先级。可以用setPriority方法来改变线程的优先级。定义了三个描述线程优先级的常量:MAX_PRIORITY、NORM_PRIORITY、MIN_PRIORITY。
· 每当线程调度器要调度一个新的线程时,它会首先选择优先级较高的线程。然而线程优先级是高度依赖与操作系统的,因此不应该将程序逻辑的正确性依赖于优先级。
void setPriority(int newPriority) //设置线程的优先级,可以使用系统提供的三个优先级常量static void yield() //使当前线程处于让步状态,当存在其他优先级大于等于本线程的线程时,线程调度程序会调用那个线程
2,Thread方法
2.1 sleep方法
让当前线程进入休眠状态(但线程不会释放已获取的锁),这个休眠状态其实就是Time Waiting状态,从休眠状态“苏醒”后,线程会进入到Runnable状态。
public static void sleep(long time) throws InterruptedException { Thread.sleep(time, 0); }
public static void sleep(long millis, int nanos) throws InterruptedException { if (millis < 0) { throw new IllegalArgumentException("millis < 0: " + millis); } if (nanos < 0) { throw new IllegalArgumentException("nanos < 0: " + nanos); } if (nanos > 999999) { throw new IllegalArgumentException("nanos > 999999: " + nanos); } // The JLS 3rd edition, section 17.9 says: "...sleep for zero // time...need not have observable effects." if (millis == 0 && nanos == 0) { // ...but we still have to handle being interrupted. if (Thread.interrupted()) { throw new InterruptedException(); } return; } long start = System.nanoTime(); long duration = (millis * NANOS_PER_MILLI) + nanos; Object lock = currentThread().lock; // Wait may return early, so loop until sleep duration passes. synchronized (lock) { while (true) { sleep(lock, millis, nanos); long now = System.nanoTime(); long elapsed = now - start; if (elapsed >= duration) { break; } duration -= elapsed; start = now; millis = duration / NANOS_PER_MILLI; nanos = (int) (duration % NANOS_PER_MILLI); } } } private static native void sleep(Object lock, long millis, int nanos);
可以看到,休眠时间在ms的基础上指定了ns数,并且是调用本地的sleep方法实现。
2.2 join方法
join方法,这是一个实例方法,在当前线程中对一个线程对象调用join方法会导致当前线程停止运行,等那个线程运行完毕后再接着运行当前线程。也就是说,把当前线程还没执行的部分“接到”另一个线程后面去,另一个线程运行完毕后,当前线程再接着运行。
无参数的join表示当前线程一直等到另一个线程运行完毕,这种情况下当前线程会处于Wating状态;带参数的表示当前线程只等待指定的时间,这种情况下当前线程会处于Time Waiting状态。
public final void join() throws InterruptedException { synchronized (lock) { while (isAlive()) { lock.wait(); } } }
public final void join(long millis) throws InterruptedException { join(millis, 0); }
public final void join(long millis, int nanos) throws InterruptedException { if (millis < 0 || nanos < 0 || nanos >= NANOS_PER_MILLI) { throw new IllegalArgumentException("bad timeout: millis=" + millis + ",nanos=" + nanos); } // avoid overflow: if total > 292,277 years, just wait forever boolean overflow = millis >= (Long.MAX_VALUE - nanos) / NANOS_PER_MILLI; boolean forever = (millis | nanos) == 0; if (forever | overflow) { join(); return; } synchronized (lock) { if (!isAlive()) { return; } // guaranteed not to overflow long nanosToWait = millis * NANOS_PER_MILLI + nanos; // wait until this thread completes or the timeout has elapsed long start = System.nanoTime(); while (true) { lock.wait(millis, nanos); if (!isAlive()) { break; } long nanosElapsed = System.nanoTime() - start; long nanosRemaining = nanosToWait - nanosElapsed; if (nanosRemaining <= 0) { break; } millis = nanosRemaining / NANOS_PER_MILLI; nanos = (int) (nanosRemaining - millis * NANOS_PER_MILLI); } } }
2.3 yield方法
yield方法,这是一个静态方法,作用是让当前线程“让步”,目的是为了让优先级不低于当前线程的线程有机会运行,这个方法不会释放锁。
2.4 interrupt方法
这是一个实例方法。每个线程都有一个中断状态标识,这个方法的作用就是将相应线程的中断状态标记为true,这样相应的线程调用isInterrupted方法就会返回true。通过使用这个方法,能够终止那些通过调用可中断方法进入阻塞状态的线程。常见的可中断方法有sleep、wait、join,这些方法的内部实现会时不时的检查当前线程的中断状态,若为true会立刻抛出一个InterruptedException异常,从而终止当前线程。
2.5 wait方法
wait方法是Object类中定义的实例方法。在指定对象上调用wait方法能够让当前线程进入阻塞状态(前提时当前线程持有该对象的内部锁(monitor)),此时当前线程会释放已经获取的那个对象的内部锁,这样一来其他线程就可以获取这个对象的内部锁了。当其他线程获取了这个对象的内部锁,进行了一些操作后可以调用notify方法来唤醒正在等待该对象的线程。
2.6 notify/notifyAll方法
notify/notifyAll方法也是Object类中定义的实例方法。它俩的作用是唤醒正在等待相应对象的线程,区别在于前者唤醒一个等待该对象的线程,而后者唤醒所有等待该对象的线程。
线程的状态转换如下,
- android 线程的状态
- android线程状态
- 线程的状态
- 线程的状态
- 线程的状态
- 线程状态的转换
- 线程状态的转换
- 线程的状态转换
- 线程的状态转换
- 线程状态的转换
- 浅谈线程的状态
- 线程的状态转换
- 线程的分离状态
- 获得线程的状态
- 线程的各个状态
- 线程的状态转换
- 线程的分离状态
- 线程的分离状态
- spring中bean的作用域属性single与prototype的区别
- 用于无人值守地面传感器系统的基于麦克风的振动传感器 A Microphone based Vibration Sensor for UGS Applications
- python基础知识之内置函数
- bzoj4300 绝世好题
- PHP学习笔记 PHP的“重载”
- android 线程的状态
- vue的小例子
- 从wireshark中学网络分析(一)
- Java连接MySQL数据库
- Exception in thread "main" java.lang.IllegalArgumentException: Wrong FS: hdfs://localhost:9000/user/
- Java虚拟机垃圾回收机制
- 使用APACHE部署DJANGO程序的时候如何配置静态文件支持?
- 基于Java语言的安卓编程学习之五 Menu的响应
- 第七讲项目一算两个数的正差值