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 定时调度的例子 ...
随机推荐
- 关于ping以及TTL的分析【转】
转自:http://blog.csdn.net/u013451221/article/details/46608881 首先介绍一下ping这个工具 ping [目标] 的意思就是向目标发送几个数据包 ...
- [SaltStack] Salt高可用和负载均衡部署
Saltstack HA部署 Salt官网是有HA/Rebalance/failover解决方案的, 但版本必须是2014.7, 目前该版本还没有release, 从官网下载的源码包安装使用测试起来一 ...
- MySQL的INFORMATION_SCHEMA数据库简介
大家在安装或使用MYSQL时,会发现除了自己安装的数据库以外,还有一个 information_schema数据库.information_schema数据库是做什么用的呢,使用WordPress博客 ...
- shell高级-----创建函数
基本脚本函数 1.创建函数 有两种格式可以用来在bash shell脚本中创建函数.第一种采用关键字function.后跟分配给该代码的函数名. function name { commands } ...
- wireshark学习笔记
之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS. 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括http,TCP,UDP,等网络协议包. 记得大学的 ...
- iOS升级经验分享
作者认为,及时关注.快速反应.覆盖测试是面对iOS系统升级时最重要的三大原则,文中还详细分析了iCloud Storage和Automatic Reference Counting这两大iOS 5新特 ...
- SVN环境搭建详解
SVN服务器搭建和使用(一) Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先来下载和搭建SVN服务器. 现在Subversion已经迁移到apache网 ...
- 关于 Android 平台开发相关的有哪些推荐书籍?
转自:http://www.zhihu.com/question/19579609 作者:Shan Huang 链接:http://www.zhihu.com/question/19579609/an ...
- 2017.2.20 activiti实战--第一章--认识Activiti
学习资料:<Activiti实战> 第一章 认识Activiti 内容概览:讲解activiti的特点.接口概览.架构等基本信息. 1.3 Activiti的特点 1.使用mybatis ...
- HTML5 Canvas 八星聚义动态效果
昔有石碣村七星聚义,今有Canvas八星聚义.动态效果是,八颗星以等速螺线慢慢向中心聚集,最后汇聚成一颗. 效果: 代码: <!DOCTYPE html> <html lang=&q ...