- 浏览: 102297 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (99)
- 经济 (1)
- dwr (2)
- 测试 (0)
- java (29)
- resin (1)
- oracle (3)
- 感悟 (1)
- jvm (15)
- mina2 (5)
- j2se (12)
- linux (28)
- protobuf (1)
- tcp/ip (0)
- jdbc (0)
- 数据库 (4)
- 游戏 (0)
- 技术文档 (1)
- nosql (2)
- 算法 (2)
- apache (2)
- mysql (1)
- hashcode (1)
- spring (2)
- quartz (5)
- netcat (2)
- 分页 (1)
- 正则 (0)
- shell (1)
- lsof (1)
- nginx (1)
- git (1)
最新评论
-
fys124974704:
你试下将第三条写成以下这样,你会发现你的结论不对:select ...
ORACLE分页SQL语句 -
ikon:
两个乘数没有转成integer,而是当成字符串;BigInte ...
计算任意2个正整数的乘积 -
kidding87:
效率不是很高,思路没有问题,但是你的两个乘数输入都都转为Int ...
计算任意2个正整数的乘积 -
k1280000:
------------------------同意!
学习之道
在java中有一类线程,专门在后台提供服务,此类线程无需显式关闭,当程序结束了,它也就结束了,这就是守护线程 daemon thread。如果还有非守护线程的线程在执行,它就不会结束。
守护线程有何用处呢?让我们来看个实践中的例子。
在我们的系统中经常应用各种配置文件(黑名单,禁用词汇),当修改配置文件后,一般要重启服务,系统才能够加载;当重启服务的代价比较高的情况下,这种加载方式不能满足我们的要求,这个时候守护线程该发挥它的作用了,它可以实时加载你的配置文件,无需重启。(当然,相当重要的配置文件,不推荐实时加载)
package com.ikon.thread.daemon; import java.io.File; import java.util.*; /** * 文件监测 * @author ikon99999 * */ public abstract class FileWatchdog extends Thread { static final public long DEFAULT_DELAY = 20*1000; protected HashMap fileList; protected long delay = DEFAULT_DELAY; boolean warnedAlready = false; boolean interrupted = false; public static class Entity { File file; long lastModify; Entity(File file,long lastModify) { this.file = file; this.lastModify = lastModify; } } protected FileWatchdog() { fileList = new HashMap (); setDaemon(true); } public void setDelay(long delay) { this.delay = delay; } public void addFile(File file) { fileList.put(file.getAbsolutePath(),new Entity(file,file.lastModified())); } public boolean contains(File file) { if( fileList.get(file.getAbsolutePath()) != null) return true; else return false; } abstract protected void doOnChange(File file); protected void checkAndConfigure() { HashMap map = (HashMap)fileList.clone(); Iterator it = map.values().iterator(); while( it.hasNext()) { Entity entity = (Entity)it.next(); boolean fileExists; try { fileExists = entity.file.exists(); } catch(SecurityException e) { System.err.println ("Was not allowed to read check file existance, file:["+ entity.file .getAbsolutePath() +"]."); interrupted = true; return; } if(fileExists) { long l = entity.file.lastModified(); // this can also throw a SecurityException if(l > entity.lastModify) { // however, if we reached this point this entity.lastModify = l; // is very unlikely. newThread(entity.file); } } else { System.err.println ("["+entity.file .getAbsolutePath()+"] does not exist."); } } } private void newThread(File file) { class MyThread extends Thread { File f; public MyThread(File f) { this.f = f; } public void run() { doOnChange(f); } } MyThread mt = new MyThread(file); mt.start(); } public void run() { while(!interrupted) { try { Thread.currentThread().sleep(delay); } catch(InterruptedException e) { // no interruption expected } checkAndConfigure(); } } }
FileWatchdog是个抽象类,本身是线程的子类;在构造函数中设置为守护线程;
此类用hashmap维护着一个文件和最新修改时间值对,checkAndConfigure()方法用来检测哪些文件的修改时间更新了,如果发现文件更新了则调用doOnChange方法来完成监测逻辑;doOnChange方法是我们需要实现的;看下面关于一个黑名单服务的监测服务:
package com.ikon.thread.daemon; import java.io.File; /** * 黑名单服务 * @author ikon99999 * 2011-3-21 */ public class BlacklistService { private File configFile = new File("c:/blacklist.txt"); public void init() throws Exception{ loadConfig(); ConfigWatchDog dog = new ConfigWatchDog(); dog.setName("daemon_demo_config_watchdog");//a dog.addFile(configFile);//b dog.start();//c } public void loadConfig(){ try{ Thread.sleep(1*1000);//d System.out.println("加载黑名单"); }catch(InterruptedException ex){ System.out.println("加载配置文件失败!"); } } public File getConfigFile() { return configFile; } public void setConfigFile(File configFile) { this.configFile = configFile; } private class ConfigWatchDog extends FileWatchdog{ @Override protected void doOnChange(File file) { System.out.println("文件"+file.getName()+"发生改变,重新加载"); loadConfig(); } } public static void main(String[] args) throws Exception { BlacklistService service = new BlacklistService(); service.init(); Thread.sleep(60*60*1000);//e } }
ConfigWatchDog内部类实现了doOnChange(File file)方法,当文件被修改后,watchdog调用doOnChange方法完成重新加载操作;
在blackservice的init方法中初始化watchdog线程;
d:模拟文件加载耗时
e:主要是防止主线程退出;
其实上面的FileWatchdog就是取自log4j;
发表评论
-
Quartz定时任务学习(一)简单任务
2012-04-27 12:30 841学习quartz首先了解三个概念: 调度器:负责调度作 ... -
介绍Quartz
2012-04-27 12:22 1410介绍Quartz Quartz是一个开源的任务调度 ... -
理解Quartz触发器(1)
2012-04-27 11:37 864Quartz中一个Job往往是 ... -
Quartz中SimpleTrigger的探讨
2012-04-27 11:34 7031.来写一个每隔10秒启动一次任务的例子. import j ... -
理解Java对象序列化
2012-02-15 09:38 694关于Java序列化的文章早 ... -
认识Arrays(一)打印
2012-02-03 16:52 570Arrays提供了一组操作array的静态方法。 一、基本类 ... -
oracle java数据类型对应表
2011-12-05 13:37 0[img]http://dl.iteye.com/upload ... -
计算任意2个正整数的乘积
2011-11-12 21:36 1201接上一篇整数的阶乘算法,来计算2个正整数的乘积; 算法如下: ... -
计算任意正整数的阶乘
2011-11-12 20:17 666由于阶乘的结果会超出java数据类型的最大范围,所 ... -
Java调用外部程序技巧
2011-11-08 09:17 792前些天使用Java调用外部程序的时候,发现线程会堵塞在wa ... -
多核平台下的JAVA优化
2011-11-08 09:12 629现在多核CPU是主流。利用多核技术,可以有效发挥硬件的能力 ... -
使用 Eclipse Memory Analyzer 进行堆转储文件分析
2011-11-07 17:09 770http://www.ibm.com/developerwor ... -
infoQ 文档ppt
2011-11-07 11:43 1247http://www.docin.com/app/user/c ... -
游戏性能监控
2011-11-07 10:18 01、cpu消耗(耗时)监控 在功能代码前后取时间值,相减,发 ... -
使用Cacti监控你的网络(一)- Cacti概述及工作流程
2011-11-07 09:36 674http://blog.sina.com.cn/s/b ... -
浅析 Java Thread.join()
2011-10-29 09:25 859一、在研究join的用法之前,先明确两件事情。 1.join ... -
hashmap线程不安全在哪里?
2011-10-13 11:33 1076大家都知道HashMap不是线程安全的,但是大家的理解 ... -
java面试题及答案(基础题122道,代码题19道)
2011-10-10 22:54 653http://ilovelate.itpub.net/post ... -
关于UnsupportedOperationException异常
2011-09-29 12:03 567我们在使用collection框 ... -
关注一下druid
2011-09-26 09:21 697关注一下druid,阿里开源的jdbc组件,可以监控数据库访问 ...
相关推荐
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
Java多线程读大文件 java多线程写文件:多线程往队列中写入数据
java多线程PPT 多线程基本概念 创建线程的方式 线程的挂起与唤醒 多线程问题
一个java 多线程操作数据库应用程序!!!
详细的讲解了java多线程的原理,并配有代码进行实战,适合java初学者和想对多线程有进一步了解的人。
Java多线程机制 9.1 Java中的线程 9.2 Thread的子类创建线程 9.3 使用Runable接口 9.4 线程的常用方法 9.5 GUI线程 9.6 线程同步 9.7 在同步方法中使用wait()、notify 和notifyAll()方法 9.8 挂起、恢复和终止线程 ...
Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-...
java多线程经典案例,线程同步、线程通信、线程阻塞等经典案例
多线程启动.java多线程启动.java多线程启动.java多线程启动.java
Java线程:线程的调度-守护线程 Java线程:线程的同步-同步方法 Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 ...
该文档总结了Java多线程相关的知识点,分享给大家,简单易懂!
资深Java专家10年经验总结,全程案例式讲解,首本全面介绍Java多线程编程技术的专著 结合大量实例,全面讲解Java多线程编程中的并发访问、线程间通信、锁等最难突破的核心技术与应用实践 Java多线程无处不在,如...
java多线程并发查询数据库,使用线程池控制分页,并发查询。
java多线程处理数据库数据,使用并发包,无框架,可批量处数据库数据,进行增删改。。等等操作。
Java线程:线程的调度-守护线程 28 Java线程:线程组 30 Java线程:线程的同步 33 一、 同步方法 35 二、 同步块 36 三、 volatile关键字 38 四、 使用synchronized关键字要注意以下四点 39 五、 关于同步和锁定的...
java多线程实现大批量数据切分成指定份数的数据,然后多线程处理入库或者导出,线程的个数和每份数据的数量都可以控制
java 多线程 其实就是每个线程都拥有自己的内存空间,多线程之间的通信,比例A线程修改了主内存(main方法的线程)变量,需要把A线程修改的结果同步到主线程中,这时B线程再从主线程获取该变量的值,这样就实现了...
java多线程视频1.rar、java多线程视频2.rar、java多线程视频3.rar、java多线程视频4.rar,4个压缩包,这个是java多线程视频1.rar
java多线程处理大数据,可根据配置的线程数,任务去调度处理
java多线程,对多线程,线程池进行封装,方便使用