首页 > 代码库 > java下的多线程操作工具类(原创)
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; } }
实现的很粗糙。但总算是实现了需要的功能,给自己赞一个~
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。