java并发编程(三)-守护线程、线程工厂

来源:互联网 发布:java陈芸 编辑:程序博客网 时间:2024/06/05 06:05

摘要:本篇文章主要讲述后台线程。当最后一个非后台线程终止时,后台线程会“突然”终止。因此一旦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中文翻译有问题查找英文原版后纠正了。

0 0