线程结束等待(join)与线程优先级(Priority)

    |     2015年5月21日   |   多线程编程   |     0 条评论   |    1807

通常希望主线程最后结束。前面的例子往往在 main() 里调用 sleep(),靠足够长的延迟保证子线程先结束。这并不可靠:一个线程怎么知道另一个已经结束?Thread 类提供了回答这个问题的方法。

一、isAlive 与 join

判定线程是否结束有两种做法。第一是调用 isAlive():

final boolean isAlive()

所调用线程仍在运行则返回 true,否则 false。实际开发里 isAlive() 用得少,更常用的是等待线程结束的 join():

final void join() throws InterruptedException

名字来自「等待指定线程加入进来」:当前线程阻塞,直到被调用的那条线程结束。还有带超时的重载,可以给等待设一个上限。

方法 作用 典型用法
isAlive() 查询线程是否还活着 轮询状态,很少单独依赖
join() 等待该线程结束 保证主线程最后退出

二、用 join 等子线程

下面是前面例子的改进版:用 join 确保主线程最后结束,同时也演示 isAlive。

// Using join() to wait for threads to finish.
class NewThread implements Runnable {
    String name;
    Thread t;
    NewThread(String threadname) {
        name = threadname;
        t = new Thread(this, name);
        System.out.println("New thread: " + t);
        t.start();
    }
    public void run() {
        try {
            for (int i = 5; i > 0; i--) {
                System.out.println(name + ": " + i);
                Thread.sleep(1000);
            }
        } catch (InterruptedException e) {
            System.out.println(name + " interrupted.");
        }
        System.out.println(name + " exiting.");
    }
}
class DemoJoin {
    public static void main(String args[]) {
        NewThread ob1 = new NewThread("One");
        NewThread ob2 = new NewThread("Two");
        NewThread ob3 = new NewThread("Three");
        System.out.println("Thread One is alive: " + ob1.t.isAlive());
        System.out.println("Thread Two is alive: " + ob2.t.isAlive());
        System.out.println("Thread Three is alive: " + ob3.t.isAlive());
        try {
            System.out.println("Waiting for threads to finish.");
            ob1.t.join();
            ob2.t.join();
            ob3.t.join();
        } catch (InterruptedException e) {
            System.out.println("Main thread Interrupted");
        }
        System.out.println("Thread One is alive: " + ob1.t.isAlive());
        System.out.println("Thread Two is alive: " + ob2.t.isAlive());
        System.out.println("Thread Three is alive: " + ob3.t.isAlive());
        System.out.println("Main thread exiting.");
    }
}

程序输出类似:三条线程创建后 isAlive 都为 true;倒计时交错打印;join 返回后三条都是 false,主线程才退出。join 返回,说明被等待的线程已经终止。

三、线程优先级

线程调度用优先级决定何时允许运行。理论上高优先级比低优先级获得更多 CPU 时间;实际上还受操作系统等多种因素影响。设置优先级只是让线程先执行的概率增大,并不保证一定先跑。

final void setPriority(int level)
final int getPriority()

level 必须在 MIN_PRIORITY(通常 1)到 MAX_PRIORITY(通常 10)之间。默认用 NORM_PRIORITY(通常 5)。它们都是 Thread 里的 final 常量。当前优先级用 getPriority() 读取。

一句话总结:别用 sleep 赌子线程结束;join 等待、isAlive 查询;优先级只提高被调度的概率,不保证顺序。

转载请注明来源:线程结束等待(join)与线程优先级(Priority)
本文链接地址:https://ai.zhousir.top/?p=683
回复 取消