java下的多线程操作工具类(原创)

因为毕业设计上需要将控制台的任务实时输出到界面上,

而且那是个Hadoop的mapreduce任务,一跑半个小时的节奏,所以需要用到多线程并随时读取返回的数据,

百度了没找到合适的方法,于是被逼无奈编写了这个十分简单的多线程操作工具类。

大概的功能就是可以执行一个特定的线程(线程必须调用本类的方法才能实现实时输出信息的功能),然后随时调用readResult方法就可以获取到结果集。

在毕业设计的应用上,就是创建一个工具类,然后让它自己去跑,根据taskId保存到session中,用ajax循环读取。


package com.imut.szd.common;

import java.util.ArrayList;
import java.util.Iterator;

/**
* 控制台任务类
* 本类包含一个线程,为主线程与任务线程的通讯类。
* 任务线程必须调用本类的writeResult方法才能将数据输出到本类中。
* 任务线程必须设置本类的OVER属性以确定执行结束
* 本类不宜多次执行!
* @author shizhida
*
*/
public class ConsoleTask {

private ArrayList<String> resultSet;//返回结果集
private ArrayList<String> resultBuffer;//缓冲返回结果集,当LOCK的时候将数据输出到这里
private Runnable task;//执行的线程体
private String consoleTaskId;//任务ID,用于在session中查找到相应对象
public boolean LOCK;//读取锁,当主线程读取数据时先设置本参数为true,防止冲突。
public boolean OVER;//结束判断
public boolean NEW;//是否有新数据的判断,当写入时将本参数设置为true,避免无用的读取。
public ConsoleTask(String id){
LOCK = false;
OVER = false;
NEW = false;
consoleTaskId = id;
resultSet = new ArrayList<String>();
resultBuffer = new ArrayList<String>();

}
public void start(){
new Thread(task).start();
}
public Runnable getTask() {
return task;
}

public void setTask(Runnable task) {
this.task = task;
}

public String getConsoleTaskId() {
return consoleTaskId;
}

public void setConsoleTaskId(String consoleTaskId) {
this.consoleTaskId = consoleTaskId;
}

/**
* 读取结果集的操作。
* @return
*/
public String[] readResult(){
LOCK = true;//设置读取锁
String[] result = new String[resultSet.size()];//创建返回值
for(int i=0;i<result.length;i++){
result[i] = resultSet.get(i);
}
resultSet.clear();//清空结果集
NEW = false;//声明没有新结果
LOCK = false;//解锁
return result;
}
/**
  *写入结果集的操作
  **/
public void writeResult(String res){
if(!LOCK)//判断是否有锁,无锁执行以下代码:
{
//将缓冲结果集的数据转移到结果集中
if(resultBuffer.size()!=0)
{
Iterator<String> iter = resultBuffer.iterator();
while(iter.hasNext()){
resultSet.add(iter.next());
}
resultBuffer.clear();
}
//向结果集输出数据
resultSet.add(res);
}
//若已上锁,向缓冲结果集输出数据
else resultBuffer.add(res);
NEW = true;//声明新结果存在
}

public void destory(){
System.out.println("ConsoleTask "+consoleTaskId+"has been destory!");
//SessionOperation.remove(this.getConsoleTaskId());
this.OVER = true;
}
}

实现的很粗糙。但总算是实现了需要的功能,给自己赞一个~

时间: 2024-10-08 12:52:02

java下的多线程操作工具类(原创)的相关文章

Java下的URL生成类

该类用于生成一个可用的URL,方便URL的生成和管理. /** * 构造的URL * @author Alvin */ final public class UrlBuilder { // 协议名称 private String scheme; // 服务器名称 private String serverName; // 端口号 private int serverPort; // 上下文名称 private String[] paths; // 参数集合 private Map<String,

java实现简单文件操作工具类

本篇带来关于文件操作的简单工具类,包括文件夹创建,文件夹删除,文件创建,文件重命名,文件复制,文件删除.如果需要文件夹复制,其实就是创建文件夹和复制文件的操作.下面直接上代码 package com.util; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.Fil

JAVA下实现多线程断点下载

多线程断点下载:顾名思义是用多线程实现的,断点是当第三方因素(断电.断网等)中断下载时,下次下载可以继续上次下载的地方下载. 1.通过getContentLength可以获取要下载文件的大小,这样可以在本机上创建一个相同大小的文件用来下载. int fileLength = connection.getContentLength(); 2.由于是多线程,所以要给每一个线程均分分配要下载的位置. for(int i = 0; i < threadCount; i ++) { int startTh

Java基础之多线程Stack类

使用Stack类实现生产者与消费者 1 package com.imooc.demo; 2 3 import java.util.Random; 4 import java.util.Stack; 5 //生产者 6 public class StackOOPS implements Runnable{ 7 8 private Stack<Integer> stack; 9 public StackOOPS(Stack<Integer> stack){ 10 this.stack

Java IO(文件操作工具类)

FileOperate实现的功能: 1. 返回文件夹中所有文件列表 2. 读取文本文件内容 3. 新建目录 4. 新建多级目录 5. 新建文件 6. 有编码方式的创建文件 7. 删除文件 8. 删除指定文件夹下所有文件 9. 复制单个文件 10. 复制整个文件夹的内容 11. 移动文件 12. 移动目录 13. 建立一个可以追加的bufferedwriter 14. 得到一个bufferedreader Java代码    package utils; import java.io.Buffer

Java多线程——ThreadLocal类

一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLocalVar更加合适.线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突. 从线程的角度看,每个线程都保持一个对其线程局

【原创】中文分词系统 ICTCLASS2015 的JAVA封装和多线程执行(附代码)

本文针对的问题是 ICTCLASS2015 的多线程分词,为了实现多线程做了简单的JAVA封装.如果有需要可以自行进一步封装其它接口. 首先ICTCLASS2015的传送门(http://ictclas.nlpir.org/),其对中文分词做的比较透彻,而且有一定的可调式性.但是应用到实际开发中的话,多线程操作是必须的,因此有了本文的初衷. 可能有的小伙伴不太清楚ICTCLASS是干嘛的,下面是一段介绍:NLPIR汉语分词系统(又名ICTCLAS2015),主要功能包括中文分词:词性标注:命名实

设计模式——单例模式(Java)——考虑多线程环境下的线程安全问题

设计模式--单例模式(Java)--考虑多线程环境下的线程安全问题 一:单例模式概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例 二:单例模式的实现方式 特别注意,在多线程环境下,需要对获取对象实例的方法加对象锁(synchronized) 方式一:(懒汉式)程序执行过程中需要这个类的对象,再实例化这个类的对象 步骤: 1.定义静态私有对象 2.构造方法私有化保证在类的外部无法实例化该类的对象 3.定义对外开放的静

JAVA FileUtils(文件读写以及操作工具类)

转别人的合并的链接 //https://www.cnblogs.com/chenhuan001/p/6575053.html //https://blog.csdn.net/lovoo/article/details/77899627 第一个链接找不到了作者看见了说一下我给你上链接(但是你的名字信息没改哈!!) package com; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import