问题
应用中有时候会有读取日志文件,并做近实时分析的需求(日志监控等)。但是使用类似Log4j的日志框架,日志文件可能会滚动:老的日志文件重命名成其它文件名(比如以日期为后缀),生成一个与老文件同名的新文件,这时候就需要读取日志文件的线程能够正确区分新老文件,并读取相应更新并且不会漏读数据。当然,这个问题的前提是:日志文件本身只会append,而不会在文件中间写入或者删除。本文主要分享下解决这个问题时碰到的一些问题及解决方案。
应用中有时候会有读取日志文件,并做近实时分析的需求(日志监控等)。但是使用类似Log4j的日志框架,日志文件可能会滚动:老的日志文件重命名成其它文件名(比如以日期为后缀),生成一个与老文件同名的新文件,这时候就需要读取日志文件的线程能够正确区分新老文件,并读取相应更新并且不会漏读数据。当然,这个问题的前提是:日志文件本身只会append,而不会在文件中间写入或者删除。本文主要分享下解决这个问题时碰到的一些问题及解决方案。
根据Java文档描述,ForkJoinPool中一种特殊的ExecutorService,可以执行ForkJoinTask。ForJoinTask可以在运行时Fork子任务,并join子任务的完成,本质上类似分治算法:将问题尽可能的分割,直到问题可以快速解决。对ForkJoinPool来说,与其它ExecutorService最重要的不同点是,它的工作线程会从其它工作线程的任务队列偷任务来执行。
(注:文章里涉及到的代码分析,基于jdk1.7.0_10 Hotspot 64-Bit)
Java同步机制除了内置的synchronized(包含Object.wait/notify)以外,还通过concurrent包提供了多种锁,包含ReentrantLock、Semaphore、ReentrantReadWriteLock等,以及跟Object.wait/notify类似语义的Condition接口。
中断线程是指:线程正在运行,还没有正常退出(run方法顺利结束),而某个事件的发生导致该线程必须中断当前正在执行的任务,该线程或者退出,或者等待其它事件然后再继续执行。稳定的基于线程的服务,在程序退出时,必须能够安全的释放线程所占用的资源,减少对系统性能的影响。
最近想测试下Openfire下的最大并发数,需要开大量线程来模拟客户端。对于一个JVM实例到底能开多少个线程一直心存疑惑,所以打算实际测试下,简单google了把,找到影响线程数量的因素有下面几个: