java多线程那些事之中的一个
1. Callable 接口
获取线程运行状态(get、get(long timeout)),取消线程(cancel(boolean mayinterruptifrunning))。isCancel,isDone等。
1. 实现callable 接口,
2. 创建线程池。submit thread
例如以下所看到的:
Future< ? > processFuture = submitTask(
new ProcessPbxPhoneThread(queue, phoneHandler, runningLock, runningFlagMap));
private class ProcessPbxPhoneThread implements Callable<Boolean>
{
private BlockingQueue<PbxPhone> queue;
private IPbxNotificationHandler<PbxPhone> phoneHandler;
private ReadWriteLock runningLock;
private Map<String, Boolean> runningFlagMap;
private int processedPhoneCount = 0;
private long currentTime; public ProcessPbxPhoneThread(BlockingQueue<PbxPhone> queue,
IPbxNotificationHandler<PbxPhone> phoneHandler, ReadWriteLock runningLock,
Map<String, Boolean> runningFlagMap)
{
this.queue = queue;
this.phoneHandler = phoneHandler;
this.runningFlagMap = runningFlagMap;
this.runningLock = runningLock;
} @Override
public Boolean call()
throws Exception
{
while (true)
{
PbxPhone phone = queue.take();
if (processedPhoneCount % 100 == 0)
{
long now = System.currentTimeMillis();
if (currentTime != 0)
{
double speed = processedPhoneCount * 1000.0 * 60 / (now - currentTime);
log.debug("ProcessPbxPhoneThread phone process speed:{}*m", speed);
}
currentTime = now;
processedPhoneCount = 0;
}
processedPhoneCount++; if (null != phone.getLines())
{
currentTime("invokePhoneHander");
PbxNotification<PbxPhone> notification = new PbxNotification<PbxPhone>(
phoneHandler.getNotificationType(), NotificationOperation.INSERT,
phone.getUuid().toString(), phone);
if (!phoneHandler.objectChanged(notification))
{
logSpentTime("invokePhoneHander");
try
{
runningLock.writeLock().lock();
runningFlagMap.put("runningFlag", false);
break;
}
finally
{
runningLock.writeLock().unlock();
}
}
else
{
logSpentTime("invokePhoneHander");
}
}
else
{
break;
}
}
return true;
}
}
submitTask 利用封装好的线程池提交线程:
protected Future< ? > submitTask(Callable< ? > task)
{
return this.cucmDriverFactory.<strong style="background-color: rgb(255, 0, 0);">getExecutorService</strong>().submit(task);
}
线程池创建例如以下代码:
@Override
public void initialize()
{
executorService = Executors.newCachedThreadPool(new DefaultThreadFactory("CucmDriverFactor-"));
}
@Override
public ExecutorService getExecutorService()
{
if (executorService.isShutdown() || executorService.isTerminated())
{
initialize();
}
return this.executorService;
}
ThreadFactory 创建例如以下:
/**
* The thread factory, with name Prefix. Copied from ThreadPoolExecutor.DefaultThreadFactory
*/
public static class DefaultThreadFactory implements ThreadFactory {
private final ThreadGroup group;
private final AtomicInteger threadNumber = new AtomicInteger(1);
private final String namePrefix;public DefaultThreadFactory(String namePrefix) {
SecurityManager s =
java多线程那些事之中的一个的更多相关文章
- Java多线程学习开发笔记
线程有有序性和可见性 多个线程之间是不能直接传递数据交互的,它们之间的交互只能通过共享变量来实现. 在多个线程之间共享类的一个对象,这个对象是被创建在主内存(堆内存)中,每个线程都有自己的工作内存(线 ...
- Java多线程的同步机制(synchronized)
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...
- java多线程入门学习(一)
java多线程入门学习(一) 一.java多线程之前 进程:每一个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销.一个进程包括1--n个线程. 线程:同一类线程共享代码 ...
- Java——多线程练习
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- 关于JAVA多线程的那些事__初心者
前言 其实事情的经过也许会复杂了点,这事还得从两个月前开始说.那天,我果断不干IT支援.那天,我立志要做一个真正的程序猿.那天,我26岁11个月.那天,我开始看Android.那天,我一边叨念着有朋自 ...
- Java多线程(二)关于多线程的CPU密集型和IO密集型这件事
点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更新中~ 正式篇: Java多线程(一) 什么是线程 Java多线程(二)关于多线程的CPU密集型和IO密集型这件事 Java多线程(三)如何 ...
- Android多线程分析之中的一个:使用Thread异步下载图像
Android多线程分析之中的一个:使用Thread异步下载图像 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可.转载请注明出处 打算整理一下对 Android Fr ...
- Java多线程编程那些事:volatile解惑--转
http://www.infoq.com/cn/articles/java-multi-thread-volatile/ 1. 前言 volatile关键字可能是Java开发人员“熟悉而又陌生”的一个 ...
- java 多线程——一个定时调度的例子
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
随机推荐
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---14
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- 基于Xen实现一种domain0和domainU的应用层数据交互高效机制 - 2
继续昨天的思路,今天先google了类似的实现domain0和domainU之间数据传输的方案 [Xen-devel] XenStore as a data transfer path? 这篇帖子讨 ...
- [MySQL] lock知识梳理
MySQL Lock机制 INDEX: MySQL事务隔离级别 MVCC MySQL Lock类型 MySQL MDL CONTENT: 1. MySQL事务隔离级别 Read Uncommit RU ...
- PHP二维数组排序研究
前几天在项目中碰到了一个问题,在做商城的时候,要对一个店铺里所有商品进行价格排序,而且每一种商品都拥有多个规格,要取到所有商品中所有规格的最低价和最高价,发现PHP有很友好的函数帮助我们进行筛选. 使 ...
- Educational Codeforces Round 34 D. Almost Difference【模拟/stl-map/ long double】
D. Almost Difference time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- Codeforces Round #450 (Div. 2) B. Position in Fraction【数论/循环节/给定分子m 分母n和一个数c,找出c在m/n的循环节第几个位置出现,没出现过输出-1】
B. Position in Fraction time limit per test 1 second memory limit per test 256 megabytes input stand ...
- php类中静态变量与常亮的区别
在效率上:常量编译过程比静态变量快的多. 代码: <?php error_reporting(E_ALL); class A { const c = 9; public static $b = ...
- Install Ruby on Rails on Ubuntu 12.04 LTS
1:Update package repository. sudo apt-get update 2:Install git and Curl. Git:是一个简单,快速,高效的版本控制系统. ...
- apache mina框架
http://blog.csdn.net/ljx8928358/article/details/7759024
- iOS 给三方日历加上农历
首先创建一个农历文件 LunarCalendar.h // // LunarCalendar.h // Hnair4iPhone // // Created by yingkong1987 on 13 ...