摘要:本篇文章主要讲述后台线程。当最后一个非后台线程终止时,后台线程会“突然”终止。因此一旦main()退出,JVM就会立即关闭所有的后台进程(线程),而不会有任何你希望出现的确认形式。
练习7:假设你有个Deamon.java后台线程,使用不同的休眠时间,并观察结果。
package twentyoneThread;
import java.util.concurrent.TimeUnit;
class Deamon implements Runnable {
private Thread[] t = new Thread[10];
@Override
public void run() {
for (int i = 0; i < t.length; i++) {
t[i] = new Thread(new DaemonSpan());
t[i].start();
System.out.println("DaemonSpan " + i + " started. ");
}
try {
TimeUnit.SECONDS.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for (int i = 0; i < t.length; i++) {
System.out.format("t[%d].isDaemon()=%s.\n ", i, t[i].isDaemon());
}
}
}
class DaemonSpan implements Runnable {
@Override
public void run() {
while (true) {
Thread.yield();
}
}
}
public class Daemons {
public static void main(String[] args) {
Thread d = new Thread(new Deamon());
d.setDaemon(true);
d.start();
System.out.format("d.isDaemon()= %b ,\n", d.isDaemon());
}
输出式样:
d.isDaemon()= true ,
DaemonSpan 0 started.
DaemonSpan 1 started.
DaemonSpan 2 started.
DaemonSpan 3 started.
DaemonSpan 4 started.
DaemonSpan 5 started.
DaemonSpan 6 started.
DaemonSpan 7 started.
DaemonSpan 8 started.
DaemonSpan 9 started.
练习8:把MoreBasicThread.java中所有线程修改成后台线程,并验证一旦main()退出,程序会立刻终止
package twentyoneThread;
class LifftOff implements Runnable {
private int countDown = 3;
private static int taskCount = 0;
private final int id = taskCount++;
public String Status() {
return "#" + id + "(" + (countDown > 0 ? countDown : "ExcOneOff!") + ").";
}
public LifftOff() {
System.out.println(this + "start" + id);
}
@Override
public void run() {
while (countDown-- > 0) {
System.out.println(Status());
Thread.yield();
}
}
}
public class MoreBasicThreads {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new LifftOff());
thread.setDaemon(true);
thread.start();
}
System.out.println("Waitting for liftOff");
}
}
输出式样:
twentyoneThread.LifftOff@15db9742start0
twentyoneThread.LifftOff@6d06d69cstart1
twentyoneThread.LifftOff@7852e922start2
twentyoneThread.LifftOff@4e25154fstart3
twentyoneThread.LifftOff@70dea4estart4
Waitting for liftOff
练习9:修改SimplePriorities.java,使得定制ThreadFactory可以设置线程的优先级。
package twentyoneThread;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
class SimplePriorities implements Runnable {
private int countDown = 5;
private volatile double d;
public String toString() {
return Thread.currentThread() + ":" + "countDown=" + countDown;
}
@Override
public void run() {
while (true) {
for (int i = 0; i < 100000; i++) {
d += (Math.PI + Math.E) / (double) i;
if (i / 1000 == 0) {
Thread.yield();
}
}
System.out.println(this);
if (--countDown == 0) {
return;
}
}
}
}
//继承ThreadFactory接口,实现newThread抽象方法;
class SimplePrioritiesFactory implements ThreadFactory {
private final int priortitys;
//通过构造方法设置priortiy属性
public SimplePrioritiesFactory(int priortitys) {
this.priortitys = priortitys;
}
public Thread newThread(Runnable runnable) {
Thread thread = new Thread(runnable);
thread.setPriority(priortitys);
return thread;
}
}
public class TestSimplePriorities {
public static void main(String[] args) {
ExecutorService eService = Executors.newCachedThreadPool(new SimplePrioritiesFactory(Thread.MIN_PRIORITY));
for (int i = 0; i < 5; i++) {
eService.execute(new SimplePriorities());
}
Thread.yield();
eService.shutdown();
ExecutorService eService2 = Executors.newCachedThreadPool(new SimplePrioritiesFactory(Thread.MAX_PRIORITY));
eService2.execute(new SimplePriorities());
Thread.yield();
eService2.shutdown();
}
}
输出式样:
Thread[Thread-5,10,main]:countDown=5
Thread[Thread-0,1,main]:countDown=5
Thread[Thread-2,1,main]:countDown=5
Thread[Thread-4,1,main]:countDown=5
Thread[Thread-0,1,main]:countDown=4
Thread[Thread-2,1,main]:countDown=4
Thread[Thread-4,1,main]:countDown=4
Thread[Thread-0,1,main]:countDown=3
Thread[Thread-2,1,main]:countDown=3
Thread[Thread-4,1,main]:countDown=3
Thread[Thread-5,10,main]:countDown=4
Thread[Thread-3,1,main]:countDown=5
Thread[Thread-1,1,main]:countDown=5
Thread[Thread-5,10,main]:countDown=3
Thread[Thread-0,1,main]:countDown=2
Thread[Thread-2,1,main]:countDown=2
Thread[Thread-4,1,main]:countDown=2
Thread[Thread-5,10,main]:countDown=2
Thread[Thread-0,1,main]:countDown=1
Thread[Thread-2,1,main]:countDown=1
Thread[Thread-4,1,main]:countDown=1
Thread[Thread-5,10,main]:countDown=1
Thread[Thread-1,1,main]:countDown=4
Thread[Thread-3,1,main]:countDown=4
Thread[Thread-3,1,main]:countDown=3
Thread[Thread-3,1,main]:countDown=2
Thread[Thread-3,1,main]:countDown=1
Thread[Thread-1,1,main]:countDown=3
Thread[Thread-1,1,main]:countDown=2
Thread[Thread-1,1,main]:countDown=1
总结:这三个小题虽然属于后台线程的题目但是综合回顾了线程池和ThreadFactory的用法。练习8中文翻译有问题查找英文原版后纠正了。