线程结束等待(join)与线程优先级(Priority)
周sir |
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)
我是周sir,这是我的博客。致力于分享我学会的技术和优秀的文章。微信公众号 “周sir专栏” 欢迎大家关注。