`
rcfalcon
  • 浏览: 228027 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java简单任务池

    博客分类:
  • Java
阅读更多
这次我们来基于java设计并实现一个简单的任务池。



什么叫任务池?

实际上就是一个任务流水线,可以将各种待完成的任务发布到流水线中。由任务池统计管理并且调度,来保证任务的完成。可能会有这样的疑问:我对每个任务都单独起一个线程,让其独立完成不就可以了么?对于小批量、快速、占用少量资源的任务可能这样没有问题,但是对于大规模、多并发的任务,这样的结果是会造成系统性能极其低下,并且还很可能造成资源需求上的溢出。



如何用有限的资源,调度并完成任务,这就是我们任务池的最终目标。



很直观,直接上任务池中就是有一个队列存储任务对象,对于每个任务它能知道当前任务状态(尚未开始、进行中、已完成)。当一个任务完成的时候,它将该任务清除,并且取出一个其他尚未完成的任务并开启之。



任务池应该具有并发性能,可以限制同时最多有多少个任务并行执行。



好,需求明确了,下面直接看代码吧。该代码实现子任务调用FFMPEG进行视频转码,而任务管理池用于限制并调度任务并发的执行。


/**
 * 
 */
package com.nvvideo.upload.logic;

import java.util.LinkedList;


/**
 * TransferManager
 * <p>Title: 视频转码任务管理器</p>
 * <p>Description: </p>
 * <p>Date: 2010-7-14</p>
 * <p>Copyright: Copyright (c) 2010</p>
 * <p>Company: novel-supertv.com</p>
 * @author chenggong
 * @version 1.0
 */
public class TransferManager {
	
	private int maxThreadNum = 1;
	private LinkedList<TransferTaskBase> fileList;
	private int workingThreadNum = 0;
	
	public TransferManager(){
		this.fileList = new LinkedList<TransferTaskBase>();
	}
	
	/**
	 * 设置最大并发数
	 * @param num
	 */
	public void setMaxThreadNum( int num ){
		this.maxThreadNum = num;
	}
	
	/**
	 * 增加文件转码任务
	 * @param task  
	 */
	public synchronized void addFileTask( TransferTaskBase task ){
		fileList.addFirst(task);
	}
	
	/**
	 * 启动转码任务
	 */
	public void startTransfer(){
		if( workingThreadNum >= maxThreadNum )
			return;
		else{
			transferNext();
		}
	}
	
	private synchronized TransferTaskBase getNextFile(){
		if( fileList.size() == 0 )
			return null;
		else
			return fileList.removeLast();
	}
	
	protected synchronized void threadLive(){
		workingThreadNum++;
	}
	
	protected synchronized void threadFinish(){
		workingThreadNum--;
	}
	

	/**
	 * 启动下一个转码任务
	 */
	public void transferNext(){
		TransferTaskBase task = this.getNextFile();
		if( task == null ){
			return;
		}
		else{
			task.start();
		}
	}
}
 

 

转码任务基类

 package com.nvvideo.upload.logic;

import com.nvvideo.logic.VideoLogic;
import com.nvvideo.po.Video;

/**
 * TransferTaskBase
 * <p>Title: 视频转码任务基类</p>
 * <p>Description: </p>
 * <p>Date: 2010-7-14</p>
 * <p>Copyright: Copyright (c) 2010</p>
 * <p>Company: novel-supertv.com</p>
 * @author chenggong
 * @version 1.0
 */
public abstract class TransferTaskBase extends Thread {
	protected TransferManager manager;
	
	/**
	 * 设置管理器
	 * @param manager
	 */
	public void setManager( TransferManager manager ){
		this.manager = manager;
	}
	
	protected Video video;
	protected VideoLogic videoLogic;
	
	public void setVideo( Video video ){
		this.video = video;
	}

	public void setVideoLogic(VideoLogic videoLogic) {
		this.videoLogic = videoLogic;
	}

	protected String originFileUri; 
	
	/**
	 * 设置源文件名
	 * @param filename
	 */
	public void setOriginFile( String filename ){
		originFileUri = filename;
	}
	
	/* (non-Javadoc)
	 * 开始执行转码任务
	 * @see java.lang.Thread#run()
	 */
	final public void run(){
		manager.threadLive();
		this.execute();
		manager.threadFinish();
		manager.transferNext(); 
	}
	
	/**
	 * 执行转码
	 * 必须以阻塞态执行
	 */
	protected abstract void execute();
}
 



调用示例:



transferManager 任务池

task 具体任务



transferManager.addFileTask(task);
transferManager.startTransfer();




分享到:
评论

相关推荐

    java定时任务开源案例

    - `java.util.concurrent.ScheduledExecutorService`: 这是Java并发包中的一个接口,通过实现该接口的类(如`ScheduledThreadPoolExecutor`)可以创建一个可调度的任务池。相比`Timer`,它更强大,支持多线程并行...

    Java 连接池实现

    Java连接池是应用程序管理数据库连接的一种机制,它...通过以上步骤,我们可以理解并实现一个简单的Java连接池。手动实现连接池可以加深对数据库连接管理的理解,但实际项目中,使用成熟的连接池组件会更加高效和可靠。

    基于java和quartz的简单任务调度

    本项目聚焦于使用Java编程语言和Quartz库来实现一个简单的任务调度器。 Quartz是一个开源的作业调度框架,允许开发者创建、调度和管理任务。它提供了丰富的API,支持复杂的调度策略,如定时、间隔、依赖关系等。...

    timer写的任务池

    要将`TimerTask`添加到任务池并设定执行时间,可以使用`Timer`的`schedule()`或`scheduleAtFixedRate()`方法。前者用于一次性或间隔性的任务,而后者则用于定期执行任务,即使前一次执行超时也会继续执行下一次。 ...

    mysql,sqlserver,oracle,java连接池,连接程序

    在Java编程中,数据库连接管理是一项关键任务,尤其是在高并发的Web应用中。为了提高效率和资源利用率,程序员通常会使用“连接池”技术。本项目涵盖了对MySQL、SQL Server、Oracle这三种主流关系型数据库的Java连接...

    java 数据库连接池

    使用完毕后,连接不立即关闭,而是归还给连接池,供后续任务再次使用。这样,就避免了频繁地创建和销毁连接带来的性能开销和系统资源浪费。 在Java中,常见的数据库连接池实现有以下几种: 1. **C3P0**:这是一个...

    用Java写连接池 数据库连接池

    本文将深入探讨如何用Java编写一个简单的数据库连接池,并分析其在并发访问中的应用。 首先,数据库连接池的基本原理是预先创建一定数量的数据库连接,存储在内存中,当应用程序需要连接数据库时,可以从连接池中...

    java 简单连接数据库

    在Java编程中,连接数据库是一项基础且至关重要的任务。它使得应用程序能够与存储数据的数据库进行交互,执行增删改查(CRUD)操作。在这个场景中,我们讨论的是使用Java来实现简单数据库连接,这通常涉及到JDBC...

    java oracle 数据库 连接池 小例子

    在Java开发中,数据库连接管理是一项重要的任务,尤其是在高并发的环境下,为了提高效率和资源利用率,通常会采用连接池技术。本示例是关于如何使用C3P0连接池来连接Oracle数据库的一个简单实例。C3P0是一个开源的...

    JAVA_java数据库连接池[借鉴].pdf

    使用完毕后,不是关闭连接,而是将其归还回连接池,供后续任务重复使用。这样,连接池可以有效地管理和调度数据库连接,避免了频繁创建和销毁连接的性能瓶颈。 在设计连接池时,通常会遇到以下几个关键问题: 1. *...

    java连接数据库操作用到的jar包

    在Java编程中,连接数据库是一项基础且至关重要的任务。Java应用程序通过JDBC(Java Database Connectivity)接口与各种类型的数据库进行通信。本篇文章将详细介绍如何在Java中使用JDBC连接MySQL数据库,以及涉及到...

    java定时任务制定

    这种方法适用于无需复杂状态管理的简单任务。 对于触发任务的时机,Spring提供了`CronTrigger`和`SimpleTrigger`等Trigger类型。`CronTrigger`允许你使用Cron表达式定义触发时间,而`SimpleTrigger`则基于间隔时间...

    Java实现简单的数据库以及银行系统实现

    在本项目中,"Java实现简单的数据库以及银行系统实现"是一个使用Java编程语言构建的银行管理系统,它允许用户与数据库进行交互,执行常见的银行交易操作。这个系统的关键知识点包括Java编程、数据库连接、对象关系...

    java爬虫简单实现

    在Java中,我们可以利用各种库来构建一个简单的爬虫,例如Jsoup、Apache HttpClient、WebMagic等。以下是对Java爬虫实现的一些关键知识点的详细说明: 1. **HTTP请求与响应**: - Java中的`HttpURLConnection`类...

    数据库连接池浅析Java开发Java经验技巧共5页.pdf

    数据库连接池,简单来说,就是一组预先初始化的数据库连接,这些连接被存储在一个“池”中,供多个应用程序共享。当应用程序需要与数据库交互时,它可以从池中获取一个已存在的连接,而不是每次都创建新的连接。使用...

    简单的java代码生成器

    【标题】"简单的Java代码生成器"涉及到的是Java编程领域中的自动化工具,它主要用于简化开发者编写重复性代码的过程。在软件开发中,特别是在Java企业级应用开发中,大量的代码是相似或者重复的,如数据库访问层...

    java 连接数据库实现用户登录功能

    在Java编程中,连接数据库以实现用户登录功能是一项基础但重要的任务。这通常涉及到数据库的交互,如查询、验证用户凭据等。本教程将详细解释如何使用Java连接Oracle数据库来实现这一功能。 首先,我们需要了解Java...

    Spring quartz1.6.jar(java定时任务)

    - 配置`ThreadPool`和`JobStore`,以定义线程池大小和任务存储方式。 - 可以选择性地配置`Trigger`和`JobDetail`,或者使用Spring的注解驱动方式。 2. **使用Spring的注解进行任务定义**: - 使用`@Scheduled`...

    使用JAVA原生实现简单的HTTP请求

    在Java编程语言中,发送HTTP请求是常见的网络通信任务,主要用到的是`java.net.URL`和`java.net.HttpURLConnection`这两个核心类。本篇将详细介绍如何使用Java原生API实现简单的HTTP请求。 首先,我们需要了解HTTP...

    java开源包6

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

Global site tag (gtag.js) - Google Analytics