这篇作为 Android 线程和线程池一文的辅佐,
先介绍一下 Java 线程的一些概念
一、一些概念
一个程序同时执行多个任务,通常每一个任务成为一个线程(Thread), 它是线程控制的简称;
可以同时运行一个以上的程序成为多线程程序(multithreaded);
如果需要执行一个耗时的任务,应该使用独立的线程;
二、单独一个线程执行一个任务的简单过程
1、将任务代码移到实现了 Runnable 接口的类的 run 方法中
接口
public interface Runnable{ void run(); }实现类
class MyRunnable implements Runnable{ @Override public void run() { // task code } }
2、创建一个类对象
Runnable r = new MyRunnable();
3、由 Runable 创建一个 Thread 对象
Thread t = new Thread(r);
4、启动线程
t.start();
三、线程的中断
调用 interrupt 请求终止线程;
当对一个线程调用 interrupt 方法时,线程的中断状态将被置位。这是每一个线程都具有的 boolean 标志。每个线程都应该不时检查这个标志,以判断线程是否被中断。
例
while (!Thread.currentThread().isInterrupted()){ // do more work }
四、线程的状态
可以调用 Thread.getState() 方法得到;
线程的状态分:
NEW 该线程还没有开始进行;
RUNNABLE 一旦调用了 start 方法, 线程处于 runnable 状态。既可运行状态,一个可运行的线程可能正在运行也可能没有运行;
BLOCKED 被阻塞;
WAITING 等待;
TIMED_WATING / TERMINATED 被终止状态
终止的原因:
1、因为 run 方法正常退出而被终止;
2、因为一个没有捕获的的异常而终止 run 方法二意外死亡。
五、线程优先级
通过 setPriority 方法可设置
默认情况下,一个线程继承它父线程的优先级;
可分:
MIN_PRORITY 在 thread 类中定义为 1;
NORM_PRORITY 在 thread 类中定义为 5;
MAX_PRORITY 在 thread 类中定义为 10;
六、阻塞队列(blocking queue)
对于许多线程问题,可以通过一个或多个队列以优雅且安全的方式将其形式化;
使用队列,可以安全地从一个线程向另一个线程传递数据;
当试图向队列添加元素,而队列已满或是想从队列移出元素,而队列为空的时候。阻塞队列导致线程阻塞。在协调多个线程之间的合作时,阻塞队列是一个有用的工具。
阻塞队列方法分三类
1、如果将队列当作线程管理工具来使用,会用到put 和 take 方法;
2、当试图向满的队列添加或从空的队列中移出元素时,add、 remove 、element 操作会抛出异常;
3、在一个多线程程序中,队列会在任何时候空或满, 因此一定要使用 offer、 poll 和 peek 方法替代。这些方法如果不能完成任务。只是给出一个错误提示而不是抛出异常。