1 /**
2 * 守护线程daemon['diːmən]
3 * @author Administrator
4 *
5 */
6 public class DaemonDemo {
7 public static void main(String[] args) {
8 MyDaemon dt = new MyDaemon();
9
10 if (dt.thrd.isDaemon()) {
11 System.out.println("dt is a daemon thread.");
12 }
13 System.out.println("Sleeping in main thread.");
14 try{
15 Thread.sleep(10000);
16 }
17 catch(InterruptedException exc){
18 System.out.println("Main thread interrupted.");
19 }
20
21 System.out.println("\nMain thread ending.");
22 }
23 }
24
25 class MyDaemon implements Runnable{
26 Thread thrd;
27
28 public MyDaemon() {
29 thrd = new Thread(this);
30 thrd.setDaemon(true);//守护线程:当用户线程结束时,守护线程也结束。
31 thrd.start();
32 }
33
34 @Override
35 public void run() {
36
37 try {
38 for(;;) {
39 System.out.print(".");
40 Thread.sleep(1000);
41 }
42 } catch (InterruptedException e) {
43 System.out.println("MyDaemon interrupted.");
44 }
45 }
46 }

一个简单的Reminder

 1 import java.util.Calendar;
2 import java.util.GregorianCalendar;
3
4
5 public class ReminderDemo {
6 public static void main(String[] args) {
7 Reminder mt = new Reminder("Call Harry", 2);
8
9 Reminder mt2 = new Reminder("Meet with Bill", new GregorianCalendar(2014,4,14,21,14));
10
11 for(int i = 0; i < 20; i++){
12 try {
13 Thread.sleep(1000);
14 } catch (InterruptedException e) {
15 System.out.println("Main thread interrupted.");
16 }
17 System.out.print(".");
18 }
19 System.out.println("\nMain thread ending.");
20 }
21 }
22 class Reminder implements Runnable {
23
24 Calendar reminderTime;
25
26 String message;
27
28 public Reminder(String msg, int delay) {
29 message = msg;
30 reminderTime = Calendar.getInstance();
31 reminderTime.add(Calendar.SECOND, delay);
32 System.out.printf("Reminder set for %tD %1$tr\n", reminderTime);
33 Thread dThrd = new Thread(this);
34 dThrd.setDaemon(true);
35 dThrd.start();
36 }
37
38 public Reminder(String msg, Calendar cal) {
39 message = msg;
40
41 reminderTime = cal;
42 System.out.printf("Reminder set for %tD %1$tr\n", reminderTime);//变元索引
43 Thread dThrd = new Thread(this);
44 dThrd.setDaemon(true);
45 dThrd.start();
46 }
47 @Override
48 public void run() {
49 try {
50 for(;;){
51 Calendar curTime = Calendar.getInstance();
52 if(curTime.compareTo(reminderTime) >= 0) {
53 System.out.println("\n" + message + "\n");
54 break;
55 }
56 Thread.sleep(1000);
57 }
58 } catch (InterruptedException e) {
59 System.out.println("Reminder interrupted.");
60 }
61 }
62
63 }

多线程编程<四>的更多相关文章

  1. [置顶] 曙光到来,我的新书《Android进阶之光》已出版

    独立博客版本请点击这里 由来 2016年我开始建立了自己的知识体系,所有的文章都是围绕着这个体系来写,随着这个体系的慢慢成长,开始有很多出版社联系我写书,因为比较看好电子工业出版社,就顺理成章的开始了 ...

  2. 《Android进阶之光》--注解与依赖注入框架

    No1: 标准注解: 1)@Override:覆写 2)@Deprecated:过时 3)@SuppressWarnings:取消警告 4)@SafeVarargs:申明使用了可变长度参数的方法 No ...

  3. 《Android进阶之光》--Material Design

    接上篇<Android进阶之光>--Android新特性 No1: 组件: 1)底部工作条-Bottom Sheets 2)卡片-Cards 3)提示框-Dialogs 4)菜单-Menu ...

  4. Android中的多线程编程(一)附源代码

    Android中多线程编程:Handler类.Runnable类.Thread类之概念分析 1.Handler类: Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理.Handl ...

  5. 《Android进阶之光》--多线程编程

    No1: 实现多线程的3中方法 1)继承Thread,重写run()方法 2)实现Runnable接口,并实现该接口的run()方法 3)实现Callable接口,重写call()方法 public ...

  6. 《Android进阶之光》--网络编程与网络框架

    No1: Volley源码分析: Volley.newRequestQueue-> RequestQueue.start()-> CacheDispatcher.start()->C ...

  7. Android进阶(九)APP编程感想

    从初识Android到现在,在不断做APP(二维码.条形码扫描,彩票购买,火车票余票查询)的过程中,自己学会了很多东西.找时间整理了一下,总结如下: 其中,对于前两个APP,自己都是在他人已完成的基础 ...

  8. Android中的多线程编程

    问题 Android的UI也是线程不安全的,如果要更新应用程序里的UI元素,必须在主线程中进行,否则就会抛异常.比如用一个Button的onClick函数去更新界面上的元素,就会得到一个CalledF ...

  9. 《Android进阶之光》--Android新特性

    Android 5.0新特性 1)全新的Material Design设计风格 2)支持多种设备 3)全新的通知中心设计--按照优先级显示 4)支持64位ART虚拟机 5)多任务视窗Overview ...

  10. Android进阶之光-第1章-Android新特性-读书笔记

    第 1 章 Android 新特性 1.1 Android 5.0 新特性 1.1.1 Android 5.0 主要新特性 1. 全新的 Material Design 新风格 Material De ...

随机推荐

  1. Hive——基本DML语句

    Hive--基本DML语句 DML:Data Manipulation Language(数据操作语言,与关系型数据库相似) 官方手册:https://cwiki.apache.org/conflue ...

  2. 足不出户,一探古今,打造线上3D数字博物馆!

    随着3D技术的不断革新,为了让更多的用户领略历史之美,越来越多的博物馆开始举办线上展览.通过模拟不同的环境.灯光投影.360°无死角放大缩小展品,观众可以享受到身临其境的沉浸体验.不仅如此,给展品加上 ...

  3. Tarjan判断为什么不能把dfn写成low

    Tarjan,我相信大多数人是这么写的: void tarjan(int x) { dfn[x]=low[x]=++cnt; st.push(x),vis[x]=1; for(int i=head[x ...

  4. 初识Stream API + Lambda表达式

    使用新特性简化代码,增强可读性 package com.gg.java8; import java.util.*; import org.junit.Test; public class TestLa ...

  5. ASM入网小助手卸载

    目录 ASM小助手卸载 写在前的 卸载 解除U盘禁用 写在后的 ASM小助手卸载 写在前的 有些公司内网的上网认证是用的ASM小助手,不过有时候用自己电脑接入公司内网可能会主动下载到ASM入网小助手的 ...

  6. kubernetes 降本增效标准指南|ProphetPilot:容器智能成本管理引擎

    作者 田奇,腾讯云高级工程师,专注大规模离在线混部,弹性伸缩,云原生成本优化,熟悉Kubernetes,关注云原生大数据.AI. 王孝威,腾讯云容器产品经理,热衷于为客户提供高效的 Kubernete ...

  7. [考试总结]noip模拟22

    又发现模拟 \(22\) 的总结也咕掉了,现在补上它... 似乎又是gg的一场. 以为自己的部分分数打的很全,然而到后面发现自己的树剖打假了 \(\color{green}{\huge{\text{树 ...

  8. 利用C++11可变模板,封装调用dll导出函数

    起因 开发中经常需要动态调用一些导出函数,试着利用C++11特性封装一下 尝试 常规使用 typedef int WINAPI (*TMessageBoxA)(HWND hWnd,LPCSTR lpT ...

  9. 使用javah 给.class类编译jni_helloworld.h文件头

    第一步,在idea中,编写java文件,并且编译 package jni; public class HelloWorld { static { System.loadLibrary("He ...

  10. vue知识点----element UI+vue关于日期范围选择的操作,picker-options属性的使用

    需求场景如下: 指定起止日期,后选的将会受到先选的限制 不同的日期选择器,不过也存在关联关系 实现方法不难,利用了 change 事件,动态改变 picker-options 中的 disableDa ...