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 定时调度的例子 ...
随机推荐
- 【程序打包工具 Inno Setup】转
原文转自 https://jingyan.baidu.com/article/36d6ed1f50ecfc1bcf4883aa.html
- eclipse去除所有调试断点 (转)
今天调试的时候发现之前加了太多断点,想去除所有断点,才想起来一直都没有使用过这个功能,放狗搜了一下,很快找到,记录一下. 方法一: 在工作界面,点window菜单栏,选中Preperences,在Ge ...
- Codeforces Round #466 (Div. 2) A. Points on the line[数轴上有n个点,问最少去掉多少个点才能使剩下的点的最大距离为不超过k。]
A. Points on the line time limit per test 1 second memory limit per test 256 megabytes input standar ...
- [Python Debug] How to install external python package? MAC系统下的xgboost安装
从昨天晚上开始安装xgboost,经历了各种稀奇古怪的错误,终于现在程序可以跑起来了.整个过程对python编译环境,路径设置,package安装方法有了一定了解,当然还有一些疑惑,所以姑且做个记录. ...
- Codeforces Round #324 (Div. 2) Kolya and Tanya 组合数学
原题链接:http://codeforces.com/contest/584/problem/B 题意: 有3*n个人围成一个圈,每个人可以分配1到3个硬币,但是相邻为n的三个人的和不能是6,问你有多 ...
- spring-cloud集成mybatis-plus
mybatis-plus插件是对mybatis做出系列增强插件,后面简称MP,MP可免去开发者重复编写xml.mapper.service.entity等代码,通过MP提供的实体注解来完成单表的CRU ...
- Qt小结
(1)#include 报错fatal error: QHostInfo:No such file or directory, 解决办法 在.pro文件中添加 QT += core gui netwo ...
- Jenkins内存溢出的处理方法
参考:http://openwares.net/java/jenkens_deploy_to_tomcat_error_of_outofmemoryerror.html上的说明,有如下解释: -Xms ...
- dedecms安装完成后登录后台出现空白
今天家里的电脑上新装DEDE5.7后台登陆后竟然一片空白经过分析代码,发现登录验证的时候用到了这个函数session_register(我的环境:win7+PHP5.4.3+Apache2.2.22+ ...
- 发送Post的请求代码
通过浏览器访问的URL请求,都是GET请求,接下来代码是模拟POST发送请求 import java.io.BufferedReader; import java.io.FileNotFoundExc ...