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

本文探讨了Java中后台线程的特性与行为,通过多个示例演示如何创建和使用后台线程,包括线程的生命周期、线程优先级设置及线程池的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值