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 定时调度的例子 ...
随机推荐
- 桶排序Bucket sort(转)
补充说明三点 1,桶排序是稳定的 2,桶排序是常见排序里最快的一种,比快排还要快…大多数情况下 3,桶排序非常快,但是同时也非常耗空间,基本上是最耗空间的一种排序算法 我自己的理解哈,可能与网上说的有 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---5
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: <Linux命令行与shell脚本 ...
- [Oracle] 临时将Physical Standby激活
Oracle 10g/11g下如何将物理Standby库临时激活用于测试 在实际运营环境中, 我们经常碰到类似这样的需求: 譬如想不影响现网业务评估DB补丁在现网环境中运行的时间, 或者是想在做DB切 ...
- C++ STL之count函数
谓词(predicate):是做某些检测的函数,返回用于条件判断的类型,指出条件是否成立. 总结: count : 在序列中统计某个值出现的次数 count_if : 在序列中统计与某谓词匹配的次数 ...
- 关于js延迟加载(异步操作)的方式
一.概述 最近重新开始学习js,在第一章的一个小节里写到了“脚本调用策略”,书上写的这部分不多,但是发现在我之前的(笔)面试中,问到的频率还是比较高的.自己一直习惯于直接把所有js文件写在head里, ...
- Cocos 2d-X Lua游戏开发Mac环境搭建以及一点点感悟
接触Cocos2d-x 最近由于公司项目的需要,自己开始接触Cocos,开始做一些简单的轻量级的游戏,以前没有接触过这一块的东西,也是借助这个机会学习一下游戏的开发,由于以前自己接触的全都是iOS和A ...
- facebook architecture 2 【转】
At the scale that Facebook operates, a lot of traditional approaches to serving web content breaks d ...
- linux查看hostname以及修改hostname
查看hostname : hostname 修改hostname : hostnamectl set-hostname master (比如要修改为master) 修改完重启生效 : ...
- 在Bonobo服务器里创建Repository(库)
新建Repository步骤如下: 点击“库”链接,进入“库管理”页面,如下图所示: 在“库管理”页面点击“创建新库”按钮,进入“创建新库”页面,如下图所示: 点击“建立”按钮,会进入“库管理”页面, ...
- ReactiveCocoa 迎接下一个更加美好的世界
什么是ReactiveCocoa 如果你有看Github的Trending Objective-C榜单,那你肯定是见过ReactiveCocoa了.如果你在weibo上关注唐巧.onevcat等国内一 ...