同时为什么总是处理不好感情问题多种任务是好还是不好

一种更简单的处理耗时任务的方式--IntentService - 简书
一种更简单的处理耗时任务的方式--IntentService
开启处理耗时操作的方法--IntentService
能解决的问题:
当一个任务分为多个小任务,这些小任务必须按照一定顺序来执行,而且这些任务可能会比较耗时
为什么选择这个方法:
利用这个方法无需手动控制线程的执行顺序
如果是一个后台任务,交给Service去执行,因为Service中也不能执行耗时操作,所以还是需要开启子线程开执行,使用这个方法就可以忽略这个问题
当任务执行完毕后会自动关闭服务
从Activity中发送Intent之后就可以丢给后台去处理,就算当前的Activity被finish掉也不会影响任务的执行
二、IntentService介绍
public abstract class IntentService extends Service
java.lang.Object
? android.content.Context
? android.content.ContextWrapper
? android.app.Service
? android.app.IntentService
API原版说明:
IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests through startService(Intent) the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.
This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.
All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.
中文翻译:
IntentService是一个基本类,用来处理异步请求(用Intents来传递的)的服务。客户端通过调用startService(Intent)来发送请求;当需要的时候service被启动,使用一个工作者线程来依次处理每一个Intent;当任务运行完毕之后会自动关闭。
这个“工作队列处理器”模式通常用来帮助处理应用的主线程中的任务。IntentService类是为了简化这个模式和照看结构而存在的。通过继承IntentService实现onHandleIntent(Intent)方法来使用它。IntentService将会接收Intents,创建一个工作者线程,并在适当的时候(任务结束的时候)停止服务。
所有的请求都被一个单独的工作者线程处理--他们或许需要足够长的时间来处理(并且不会阻塞应用的主循环),但是同一时间只能处理一个请求
三、IntentService的使用方法
当然到了最关心的了--用法
创建一个类,继承IntentService,注意的是这里需要写一个无参的构造方法,不然会报错
public class HandleTaskService extends IntentService {
// 继承自父类的方法
public HandleTaskService(String name) {
super(name);
// 注:这里要添加
public HandleTaskService(){
super("HandleTaskService");
实现最关键的处理方法
protected void onHandleIntent(Intent intent) {
// 这里写你的代码处理逻辑
IntentService继承自Service,所以同样需要到AndroidManifest.xml中去注册
&service android:name="com.hanvon.inputmethod.callaime.util.HandleTaskService" &&/service&
调用方式:
Intent intent = new Intent(this, HandleTaskService.class);
intent.addFlags(101);
intent.putExtra("content", content);
startService(intent);
附上生命周期图:
IntentService生命周期
图片出处:
总得写点什么才像话吧,希望这里写东西方便!
Service是Android中的四大组件之一,在Android开发中起到非常重要的作用,官方: A Service is an application component that can perform long-running operations in the ba...
一、IntentService简介 IntentService是Service的子类,比普通的Service增加了额外的功能。先看Service本身存在两个问题: Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中; Service也不是专...
序言 最近有用到IntentService,对IntentService的源码做了一定的学习,所以今天来谈谈我对intentservice的理解,后面的内容我会从官方文档对intentservice的解释、我个人的理解、源码分析三个方面做讲解。 IntentService作...
目录 一、基础回顾 定义、特点:Service是可以在后台执行长时间(长生命周期)而又不与用户产生UI交互(没有用户界面)的操作。 注意事项:1、只能在后台运行,即便用户切换了其他应用,启动的Service仍可在后台运行。2、可以和其他组件进行Service绑定并与之交互,...
自我介绍 我叫王少健,平时喜欢旅游,一方面作为兴趣爱好的培养,同时也是自我释压的方式;和平友爱是我的交流方式,做人不失小幽默。我比较喜欢专研新技术,有较扎实的Java和Android方面的基础知识。在上一年工作,因为是我个人独立开发的程序,在公司中我学到了很多,主要是在学习...
控制好心情,生活才会处处祥和。好心态塑造好心情,好心情塑造最出色的自己!
目标在那,到达的路径千奇百怪,各有各的一套说辞,各有各的论正体系,我们通常,不知道做成一件事情的确切路径,只看到光彩夺目的果实,和自己脑海中的做成之后的样子,就决定了要做一件事情。 随之而来,该付出的代价,内心的纠结,以及途中每一节点决策的进退,一件有价值的事情,势必要付出...
没有见过比黎小姐更有理的人了。 她坐公交车上班迟到,坐顺风车上班迟到,自己开车上班迟到。 迟到嘛,总是有道理的。公交车难坐啊,一趟和下一趟间隔了十几分钟。路上要么是车坏了,要么是司机和乘客干起来了,要么是车辆剐蹭了。总之,有一千个理由导致自己上班要迟到。坐顺风车嘛,也是要迟...
01 嗯,这个人,据说是唐宋八大家之一苏辙的后代。 她,祖籍在安徽黄山脚下太平湖,永丰乡岭下,一个叫苏村的地方。 经过一个世纪的轮回,一百零二岁的她,再次回到故乡,早已泪流满面。 她虽不在这里出生,却在这里成长,可惜的是,在母亲去世那年离开后,没有回来。 而,回来后的现在,...
教授,在微信里说,他来了,住某某酒店,在某某房间;这分明告诉我:大叔,ni一定得来,见一见! 说真滴,我不想去见; 对于教授,我有点嫉妒,不是因为他是教授,嫉妒他肚子里的墨水,比我多,比我黑,而是,嫉妒他的爱情;问他,和多少美女谈过,恐怕数不清了! 男人间的嫉妒心理,往往看...当面对一个耗时较长的任务时,我们可以把这个任务切分成多个部分,然后同时交给多个线程处理。 & □ 统计字节数组一个比较耗时的方式 以下来统计一个字节数组的大小。
class Program
static byte[] values = new byte[];
static void Main(string[] args)
GenerateByteArray();
Console.WriteLine("正在统计字节数");
Stopwatch watch = new Stopwatch();
watch.Start();
long total = 0;
for (int i = 0; i & values.L i++)
total += values[i];
watch.Stop();
Console.WriteLine("统计结果为:" + total);
Console.WriteLine("计算时间为:" + watch.Elapsed);
static void GenerateByteArray()
var r = new Random(987);
for (int i = 0; i & values.L i++)
values[i] = (byte)r.Next(10);
如果把统计工作同时交给多个线程,是否可以把统计时间省下来呢?
□ 同时使用多个线程
现在要对"统计字节数组大小"这个任务进行均分、切分。首先面临的问题是:按什么标准均分?--这个完全是靠个人喜好,可以让2个线程,3个线程......来处理。在这里,就根据CPU的数量来均分,因为CPU的数量可以通过Environment.ProcessorCount获得。
面临的第二问题是:均分什么?--比如有4个CPU--那可以把任务分成4个线程同时处理--把字节数组的长度均分,比如字节数组的长度是1000,均分成4段,每段长度为250--把字节数组的大小分成4个放一个数组里,即[sum1, sum2, sum3, sum4],所有的元素加起来就是字节数组的总大小
class Program
static byte[] values = new byte[];
//分段统计的大小放该数组,比如分成4等份,[,]
private static long[] partialS
//把values数组长度均等分,比如长度1000,分成4粉,那partialSize就是250
private static int partialS
static void Main(string[] args)
//根据CPU的数量确定数组的长度
partialSum = new long[Environment.ProcessorCount];
//根据CPU的数量确定数组长度均等分
partialSize = values.Length/Environment.ProcessorC
GenerateByteArray();
Console.WriteLine("正在统计字节数");
Stopwatch watch = new Stopwatch();
watch.Start();
long total = 0;
for (int i = 0; i & values.L i++)
total += values[i];
watch.Stop();
Console.WriteLine("统计结果为:" + total);
Console.WriteLine("计算时间为:" + watch.Elapsed);
Console.WriteLine();
watch.Reset();
watch.Start();
Thread[] threads = new Thread[Environment.ProcessorCount];
for (int i = 0; i & Environment.ProcessorC i++)
threads[i] = new Thread(SumPartial);
threads[i].Start(i);
//保证一个线程结束再执行下一个线程
for (int i = 0; i & Environment.ProcessorC i++)
threads[i].Join();
//统计总大小
long total2 = 0;
for (int i = 0; i & Environment.ProcessorC i++)
total2 += partialSum[i];
watch.Stop();
Console.WriteLine("使用分段线程统计的大小:" + total2);
Console.WriteLine("计算时间为:" + watch.Elapsed);
/// &summary&
/// 分段统计字节数组的大小
/// &/summary&
/// &param name="partialNumber"&比如有4个CPU,partialNumber可能的值是0, 1, 2, 3&/param&
static void SumPartial(object partialNumber)
long sum = 0;
int partialNumberAsInt = (int)partialN
int baseIndex = partialNumberAsInt * partialS
for (int i = baseI i & baseIndex + partialS i++)
sum += values[i];
partialSum[partialNumberAsInt] =
/// &summary&
/// 创建字节数组
/// &/summary&
static void GenerateByteArray()
var r = new Random(987);
for (int i = 0; i & values.L i++)
values[i] = (byte)r.Next(10);
以上,统计字节数组大小的方式倒不是最重要的,线程部分才是重点:○ 有几个CPU,就有几个线程○ 线程的实例方法Start可以传递object类型的参数○ 线程的实例方法Join,用来保证执行完上一个线程再执行下一个线程
在这里,使用多线程同时处理一个任务,效率差不多提高了2.6倍!
总结:○ 对于一个比较耗时的任务可以同时交给多个线程处理○ 线程的实例方法Join保证执行完上一个线程再执行下一个线程
线程系列包括:
阅读(...) 评论()
我的公众号:新语新世界,欢迎关注。([已注销])
(彼岸倾尘)
([已注销])
(叽叽喳喳闹闹)
第三方登录:博客分类:
应用场景:
多个部门发起资金计划,最后统一到财务部审批,每个部门发起资金计划是一个子流程,财务部审批是多个部门的计划同时审批,审批完成后,再提交上级领导审批。
流程如下:
要解决以上问题,需要实现多个子流程并行处理的功能。在Activiti5有一个比较强的节点属性就是多实例,它可以支持多实例的子流程,多实例任务,多实体脚本等。目前支持多实例的节点类型有:
多实例还有并行、串行区分。以下解释一下什么是并行与串行
并行代表同时进行,如把任务分给5个人来处理,这5个人同时会收到任务,并且可以同时处理,不受各自的影响。
串行代表工作或任务由一个人完成后,再由另一个人去处理,直至全部完成,每个任务依赖于前一个任务完成。
会签任务即可以由activiti多实例任务节点来实现,(上一博客有介绍如何开发设计会签任务)
在Activiti的定义中,生成多实例的定义很简单,只需要如下类似去生成以下标签,则可以完成多实例的声明,如下所示,我们要支持并行节点的多实例的定义
多实例人工任务
&userTask activiti:assignee="${assignee}" id="SignTask2" name="财务主管会签"&
&extensionElements&
&activiti:taskListener
class="com.hotent.platform.service.bpm.listener.TaskSignCreateListener"
event="create" /&
&activiti:taskListener
class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
event="assignment" /&
&activiti:taskListener
class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
event="complete" /&
&/extensionElements&
&multiInstanceLoopCharacteristics
activiti:elementVariable="assignee" isSequential="false"
activiti:collection="${taskUserAssignService.getSignUser(execution)}"&
&completionCondition&${signComplete.isComplete(execution) }
&/completionCondition&
&/multiInstanceLoopCharacteristics&
&/userTask&
多实例子流程
&subProcess activiti:assignee="${assignee}" id="SubProcess1"
name="部门资金计划流程"&
&startEvent activiti:initiator="startUser" id="startEvent2"
name="开始" /&
&endEvent id="endEvent1" name="结束1" /&
&userTask id="task3" name="助理填写"&
&documentation /&
&extensionElements&
&activiti:taskListener
class="com.hotent.platform.service.bpm.listener.TaskCreateListener"
event="create" /&
&activiti:taskListener
class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
event="assignment" /&
&activiti:taskListener
class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
event="complete" /&
&/extensionElements&
&/userTask&
&userTask id="task4" name="部门领导审查"&
&documentation /&
&extensionElements&
&activiti:taskListener
class="com.hotent.platform.service.bpm.listener.TaskCreateListener"
event="create" /&
&activiti:taskListener
class="com.hotent.platform.service.bpm.listener.TaskAssignListener"
event="assignment" /&
&activiti:taskListener
class="com.hotent.platform.service.bpm.listener.TaskCompleteListener"
event="complete" /&
&/extensionElements&
&/userTask&
&sequenceFlow sourceRef="startEvent2" targetRef="task3"
id="sequenceFlow1" name="" /&
&sequenceFlow sourceRef="task3" targetRef="task4" id="sequenceFlow2"
name="" /&
&sequenceFlow sourceRef="task4" targetRef="endEvent1" id="sequenceFlow3"
name="" /&
&extensionElements&
&activiti:executionListener event="start"
class="com.hotent.platform.service.bpm.listener.StartEventListener" /&
&activiti:executionListener event="end"
class="com.hotent.platform.service.bpm.listener.EndEventListener" /&
&/extensionElements&
&multiInstanceLoopCharacteristics
activiti:elementVariable="assignee" isSequential="false"
activiti:collection="${taskUserAssignService.getMultipleUser(execution)}" /&
&/subProcess&
所以关键的配置属性:
&multiInstanceLoopCharacteristics
activiti:elementVariable="assignee" isSequential="false"
activiti:collection="${taskUserAssignService.getSignUser(execution)}"&
&completionCondition&${signComplete.isComplete(execution) }
&/completionCondition&
&/multiInstanceLoopCharacteristics&
我们在控制多实例的个数或人数时,是通过taskUserAssignService的getSignUser获取或getMultipleUser(execution)其集合的个数,从而决定产生多少个实体任务或子流程。
如实现子流程多实例的获取人数,则来自:
* 获取多实体子流程的执行用户集合
* @param execution
* @throws Execption
public List&String& getMultipleUser(ActivityExecution execution) throws Exception{
String nodeId=execution.getActivity().getId();
ExecutionEntity executionEnt=(ExecutionEntity)
List&String& userIds=(List&String&)execution.getVariable(BpmConst.SUBPRO_MULTI_USERIDS);
if(userIds!=null) return userI
Map&String,FlowNode& nodeMap= NodeCache.getByActDefId(executionEnt.getProcessDefinitionId());
FlowNode subProcessNode=nodeMap.get(nodeId);
FlowNode firstNode=subProcessNode.getSubFirstNode();
FlowNode secodeNode=firstNode.getNextFlowNodes().get(0);
List&String& userList=nodeUserMapLocal.get().get(secodeNode.getNodeId());
logger.debug("userList size:" + userList.size());
execution.setVariable(BpmConst.SUBPRO_MULTI_USERIDS, userList);
return userL
因为该方法会被调用多次,所以其实现的思路是第一次其集合是来自用户的界面选择的人员列表,第一次之后,放到流程变量中去,在后续的获取中,直接从流程变量中获取。
然后在任务的创建的监听器中,从流程变量assignee中获取当前任务的执行人。以上的实现还有一细节就是要解决如何查找到子流程中的第一个任务节点,并且把对应的任务人员授给这任务节点。
想部署及学习了解,可参考本人新的博客获得下载源代码。
浏览 25315
浏览: 346104 次
来自: 广州
想部署及学习了解,可参考本人新的博客获得下载源代码。http: ...
哎。假的。
这是主流程调用子流程报的错大神指导原因吗?
pageoffice也是office在线编辑的吧,J.Offi ...
你好,想问下,串行的多实例任务能做到回退么
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'多核心CPU多个核心能同时处理单个任务吗?_百度知道
多核心CPU多个核心能同时处理单个任务吗?
都说多核心的优势是同时处理多个任务,但如果某个核心不够运行某个任务时,其他核心会一起帮助处理吗?
我有更好的答案
这得看这个任务有木有对多核优化了,不过现在多核处理器和软件都很成熟,处理单个任务一般也会多核一起处理,除非是很老的软件对多核支持不太好,那就不好说了。
采纳率:89%
来自团队:
那是肯定的。比如解压一个较大的压缩文件,这是单个任务,多核电脑比单核电脑快很多,专业的软件可以监测到多核心运行状态……
这需要改软件能支持的不是所有软件支持多核心。我经常做千万个级数据的依次比对,这时多核就没用,高频率单核很合适了
为您推荐:
其他类似问题
多核心的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 为什么总是处理不好感情问题 的文章

 

随机推荐