这次我们来基于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.util.concurrent.ScheduledExecutorService`: 这是Java并发包中的一个接口,通过实现该接口的类(如`ScheduledThreadPoolExecutor`)可以创建一个可调度的任务池。相比`Timer`,它更强大,支持多线程并行...
Java连接池是应用程序管理数据库连接的一种机制,它...通过以上步骤,我们可以理解并实现一个简单的Java连接池。手动实现连接池可以加深对数据库连接管理的理解,但实际项目中,使用成熟的连接池组件会更加高效和可靠。
本项目聚焦于使用Java编程语言和Quartz库来实现一个简单的任务调度器。 Quartz是一个开源的作业调度框架,允许开发者创建、调度和管理任务。它提供了丰富的API,支持复杂的调度策略,如定时、间隔、依赖关系等。...
要将`TimerTask`添加到任务池并设定执行时间,可以使用`Timer`的`schedule()`或`scheduleAtFixedRate()`方法。前者用于一次性或间隔性的任务,而后者则用于定期执行任务,即使前一次执行超时也会继续执行下一次。 ...
在Java编程中,数据库连接管理是一项关键任务,尤其是在高并发的Web应用中。为了提高效率和资源利用率,程序员通常会使用“连接池”技术。本项目涵盖了对MySQL、SQL Server、Oracle这三种主流关系型数据库的Java连接...
使用完毕后,连接不立即关闭,而是归还给连接池,供后续任务再次使用。这样,就避免了频繁地创建和销毁连接带来的性能开销和系统资源浪费。 在Java中,常见的数据库连接池实现有以下几种: 1. **C3P0**:这是一个...
本文将深入探讨如何用Java编写一个简单的数据库连接池,并分析其在并发访问中的应用。 首先,数据库连接池的基本原理是预先创建一定数量的数据库连接,存储在内存中,当应用程序需要连接数据库时,可以从连接池中...
在Java编程中,连接数据库是一项基础且至关重要的任务。它使得应用程序能够与存储数据的数据库进行交互,执行增删改查(CRUD)操作。在这个场景中,我们讨论的是使用Java来实现简单数据库连接,这通常涉及到JDBC...
在Java开发中,数据库连接管理是一项重要的任务,尤其是在高并发的环境下,为了提高效率和资源利用率,通常会采用连接池技术。本示例是关于如何使用C3P0连接池来连接Oracle数据库的一个简单实例。C3P0是一个开源的...
使用完毕后,不是关闭连接,而是将其归还回连接池,供后续任务重复使用。这样,连接池可以有效地管理和调度数据库连接,避免了频繁创建和销毁连接的性能瓶颈。 在设计连接池时,通常会遇到以下几个关键问题: 1. *...
在Java编程中,连接数据库是一项基础且至关重要的任务。Java应用程序通过JDBC(Java Database Connectivity)接口与各种类型的数据库进行通信。本篇文章将详细介绍如何在Java中使用JDBC连接MySQL数据库,以及涉及到...
这种方法适用于无需复杂状态管理的简单任务。 对于触发任务的时机,Spring提供了`CronTrigger`和`SimpleTrigger`等Trigger类型。`CronTrigger`允许你使用Cron表达式定义触发时间,而`SimpleTrigger`则基于间隔时间...
在本项目中,"Java实现简单的数据库以及银行系统实现"是一个使用Java编程语言构建的银行管理系统,它允许用户与数据库进行交互,执行常见的银行交易操作。这个系统的关键知识点包括Java编程、数据库连接、对象关系...
在Java中,我们可以利用各种库来构建一个简单的爬虫,例如Jsoup、Apache HttpClient、WebMagic等。以下是对Java爬虫实现的一些关键知识点的详细说明: 1. **HTTP请求与响应**: - Java中的`HttpURLConnection`类...
数据库连接池,简单来说,就是一组预先初始化的数据库连接,这些连接被存储在一个“池”中,供多个应用程序共享。当应用程序需要与数据库交互时,它可以从池中获取一个已存在的连接,而不是每次都创建新的连接。使用...
【标题】"简单的Java代码生成器"涉及到的是Java编程领域中的自动化工具,它主要用于简化开发者编写重复性代码的过程。在软件开发中,特别是在Java企业级应用开发中,大量的代码是相似或者重复的,如数据库访问层...
在Java编程中,连接数据库以实现用户登录功能是一项基础但重要的任务。这通常涉及到数据库的交互,如查询、验证用户凭据等。本教程将详细解释如何使用Java连接Oracle数据库来实现这一功能。 首先,我们需要了解Java...
- 配置`ThreadPool`和`JobStore`,以定义线程池大小和任务存储方式。 - 可以选择性地配置`Trigger`和`JobDetail`,或者使用Spring的注解驱动方式。 2. **使用Spring的注解进行任务定义**: - 使用`@Scheduled`...
在Java编程语言中,发送HTTP请求是常见的网络通信任务,主要用到的是`java.net.URL`和`java.net.HttpURLConnection`这两个核心类。本篇将详细介绍如何使用Java原生API实现简单的HTTP请求。 首先,我们需要了解HTTP...
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...