`
kongshanxuelin
  • 浏览: 922508 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

Java并发编程之复杂任务执行与跟踪

阅读更多

请思考以下的业务应用场景(很常见的一种业务应用场景):

 

	/**
	 * 此例子演示用多线程编程方式读取N个复杂任务,并在前端界面中展现
	 * 此N个复杂任务的执行进度与情况(先处理完成的先在前端展现),直到
	 * 全部复杂任务处理完成后,在前端提示用户处理完毕并展现全部结果
	 * @param args
	 */

当处理一个比较耗时而且比较适用应用多线程编程环境的情况,如某些业务系统不联网,但查询的操作需要同时提取底下各个县市的查询结果,并在前端反应查询情况,先查到的数据现在前端显示,当全部查询完成后,触发一定的事件通知页面,这里我们主要应用JDK 1.5的java.util.concurrent包下的SDK。

 

首先声明一些线程池之类的东东,还有声明一个定时任务(主要用来模拟前端查询操作):

 

 

public final static TaskResult tr = new TaskResult();
public final static ExecutorService exec = Executors.newFixedThreadPool(10);
public final static CompletionService serv = new ExecutorCompletionService(exec);
public final static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 

假设一个复杂任务,交由5个独立线程去处理,每个线程后的处理结果放到一个List中,处理代码一下:

 

 

		//假设该复杂任务分解成5个多线程任务
		for (int index = 0; index < 5; index++) {
			final int NO = index;
			Callable mytask = new Callable() {
				public String call() {
					//模拟任务需要耗费比较长的时间
					try {
						Thread.sleep((long) (Math.random() * 2000));
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					return "Task " + NO + " 处理完毕了,处理完毕时间:"+(new Date());
				}
			};
			serv.submit(mytask);
		}
		//获取5个简单任务结果
		for (int index = 0; index < 5; index++) {
			Future task;
			try {
				task = serv.take();
				String res = (String) task.get(100,TimeUnit.MILLISECONDS);
				tr.getResult().add(res);
			} catch (InterruptedException e) {
				tr.getResult().add("当前任务"+index+"被中断返回结果...");
			} catch (ExecutionException e) {
				tr.getResult().add("当前任务"+index+"执行异常返回结果...");
			} catch (TimeoutException e) {
				tr.getResult().add("当前任务"+index+"超时返回结果...");
			}
		}
		
		tr.setFinish(true);
 

 前端模拟操作交由一个定时任务去处理(相当于利用Ajax之类的技术去读取后台结果):

 

 

		//前端程序模拟:启动单独线程每个200ms查看一下,taskresult中的结果值
		final Runnable beeper = new Runnable() { 
            public void run() { 
            	int i = tr.getResult().size();
            	boolean isok = tr.isFinish();    
            	System.out.println("当前复杂任务完成情况:"+i+"/5" + ",是否完成:"+isok);
            	if(isok){
            		scheduler.shutdown();
            		exec.shutdown();
            	}           	
            } 
        };    
	    final ScheduledFuture<?> beeperHandle = 
	        scheduler.scheduleAtFixedRate(beeper, 0, 200, TimeUnit.MILLISECONDS); 

最终的运行结果如下(利用Ajax甚至可以做出进度条效果,体验非常好):

 

当前复杂任务完成情况:0/5,是否完成:false
当前复杂任务完成情况:0/5,是否完成:false
当前复杂任务完成情况:0/5,是否完成:false
当前复杂任务完成情况:0/5,是否完成:false
当前复杂任务完成情况:0/5,是否完成:false
当前复杂任务完成情况:1/5,是否完成:false
当前复杂任务完成情况:1/5,是否完成:false
当前复杂任务完成情况:2/5,是否完成:false
当前复杂任务完成情况:2/5,是否完成:false
当前复杂任务完成情况:2/5,是否完成:false
当前复杂任务完成情况:3/5,是否完成:false
当前复杂任务完成情况:3/5,是否完成:false
当前复杂任务完成情况:3/5,是否完成:false
当前复杂任务完成情况:3/5,是否完成:false
当前复杂任务完成情况:3/5,是否完成:false
当前复杂任务完成情况:4/5,是否完成:false
当前复杂任务完成情况:4/5,是否完成:false
当前复杂任务完成情况:4/5,是否完成:false
当前复杂任务完成情况:4/5,是否完成:false
当前复杂任务完成情况:4/5,是否完成:false
当前复杂任务完成情况:5/5,是否完成:true 

 

2
2
分享到:
评论

相关推荐

    java并发集合

    Java并发集合是Java并发编程的一部分,提供了线程安全的数据结构,使得多个线程可以同时访问并修改集合内容而不会产生数据不一致的问题。这些集合类主要存在于`java.util.concurrent`包中,由Doug Lea设计,极大地...

    java任务管理系统

    它结合了Java的强大功能和灵活性,为用户提供了一种集中的、用户友好的界面来创建、监控和跟踪任务执行状态。以下是对该系统及其相关知识点的详细阐述: 1. **Java编程语言**:Java是一种跨平台的面向对象的编程...

    并发编程 50 道面试题及答案.docx

    2. 方便进行业务拆分:并发编程可以将复杂的业务模型拆分成多个小的任务,每个任务可以由一个线程来执行,从而提高了应用性能。 并发编程的三个必要因素是:原子性、可见性和有序性。 1. 原子性:指的是一个或多个...

    java定时检测系统

    6. **日志记录**:在开发定时检测系统时,日志记录非常重要,它可以帮助开发者跟踪和调试任务执行情况。可以使用如Log4j、SLF4J或Java内置的`java.util.logging`框架来记录任务执行过程中的信息。 7. **异常处理**...

    Spring定时任务实现(非Web项目)

    1. **ThreadPoolTaskExecutor**:这是一个线程池任务执行器,它允许我们异步执行任务,适用于大量并发的任务执行。 2. **ScheduledTaskRegistrar**:这是一个注册器,用来注册定时任务。 3. **...

    Java调度原理及使用

    Java任务调度是编程中不可或缺的一部分,它允许程序在指定的时间点或按照预定义的周期执行特定的任务。在Java中,有多种方式可以实现任务调度,包括`Timer`、`ScheduledExecutor`以及开源库如`Quartz`和`JCronTab`。...

    计算多线程环境下执行任务时间1

    总的来说,`CountDownLatch`是Java并发编程中的一个重要工具,它简化了多线程间的同步和通信,使得在复杂环境中精确测量任务执行时间成为可能。通过合理地使用`CountDownLatch`,我们可以编写更加灵活和可控的多线程...

    JAVA编程语言在计算机软件开发中的应用

    此外,JAVA还支持多线程,这意味着可以在一个程序中同时执行多个任务,这对于现代并发处理和大数据应用来说是至关重要的。 在网络编程方面,JAVA提供了强大的支持,可以方便地处理TCP/IP协议,如HTTP、FTP等。这...

    基于Java调度系统的源代码.zip

    Java调度系统是一种用于自动化任务执行的软件系统,它能够根据预定义的时间间隔或特定事件来触发任务。在"基于Java调度系统的源代码.zip"这个压缩包中,我们很可能会找到一个实现了类似功能的Java项目。这个项目可能...

    基于Java编程语言下计算机软件开发技术的思考.pdf

    Java的核心特性之一是多线程,这使得Java能够支持并发程序设计,能够在多核处理器上并行执行任务。Java的多线程模型包括线程的创建、调度和同步机制,这都基于其语言内置的线程类和相关的同步机制,确保了多线程操作...

    java 编程常用英语单词 解释

    - **用途**:在并发编程中,线程可以根据优先级调度执行。 #### Process (进程) - **定义**:进程是正在执行的程序实例。 - **用途**:每个Java应用程序都运行在一个独立的进程中。 #### Protected (受保护的) - *...

    java写的计时器

    Java计时器是编程中一个常见且实用的工具,它可以帮助开发者在程序中精确地控制时间,例如跟踪任务执行的时间、实现定时任务等。在这个基于Java编写的计时器项目中,我们关注的是手动设置起始和终止时间的简单实现,...

    任务调度程序

    此外,任务调度程序可能还包括一些附加功能,比如任务的状态跟踪(是否已执行、是否成功、是否失败)、日志记录(记录任务执行的历史和异常信息)、通知机制(当任务完成或出错时发送提醒)等。这些功能可以通过集成...

    Java 调试技巧

    在Java编程中,多线程编程是一个重要且复杂的主题,因为它允许程序同时执行多个任务,提高CPU的利用率,尤其对于网络和交互式应用至关重要。Java内置了对多线程的支持,使得程序员可以直接在代码中创建和管理线程。 ...

    制造业MES源码.rar_MES java_MES源码_java开发制造业_mes java源码_制造

    1. **面向对象编程**:Java的面向对象特性使得代码结构清晰,易于维护,适合大型复杂系统的开发。 2. **多线程支持**:在制造业环境中,多任务并行处理是常态,Java的多线程机制能有效提升系统的并发处理能力。 3. *...

    java制作的流程引擎

    【Java制作的流程引擎】是一种基于Java编程语言开发的流程自动化工具,它的核心目标是帮助企业或组织实现工作流程的自动化管理。这样的引擎通常包括一系列组件和功能,使得开发者能够定义、执行和监控复杂的业务流程...

Global site tag (gtag.js) - Google Analytics