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中文翻译有问题查找英文原版后纠正了。
- java并发编程(三)-守护线程、线程工厂
- JAVA并发编程--守护线程(Damon Thread)
- 并发编程三——守护线程和线程阻塞
- Java并发编程之四:守护线程和线程阻塞
- Java 并发编程(三)线程管理
- java并发编程(四)--守护线程与线程阻塞的四种情况
- Java并发编程(4):守护线程与线程阻塞的四种情况
- java并发编程(14)--java的守护线程与非守护线程
- Java并发学习笔记(16)守护线程,线程组
- JAVA并发编程——守护线程(Daemon Thread)
- JAVA并发编程——守护线程(Daemon Thread)
- JAVA并发编程——守护线程(Daemon Thread)
- JAVA并发编程——守护线程(Daemon Thread)
- JAVA并发编程——守护线程(Daemon Thread)
- Java并发编程-03-守护线程的创建和运行
- JAVA并发编程——守护线程(Daemon Thread)
- JAVA并发编程——守护线程(Daemon Thread)
- JAVA并发编程——守护线程(Daemon Thread)
- skynet服务的本质与缺陷
- ES-MongoDB学习错误1_Could not import mongo_connector.doc_managers.elastic_doc_manager
- java 权限修饰符
- 表格练习2
- ZedGraph使用(一)
- java并发编程(三)-守护线程、线程工厂
- 程序员的发展方向
- Qt学习笔记之图片的上下左右移动
- cocos2d-x 2.x01基础入门
- php中xml数据接口如何生成及调用
- Android Studio无法在线更新
- 贷齐乐系统最新版SQL注入(无需登录绕过WAF可union select跨表查询) 公开时间: 2016-04-21 22:58
- CCF_Z 字形扫描
- PID-4220-素数难题