forked from LupusNobilis/java-org.hwo
org.hwo.tasklet neu
parent
1a8e84ba90
commit
004d9d6115
|
@ -1,7 +1,42 @@
|
|||
package org.hwo.tasklet;
|
||||
|
||||
public interface Tasklet {
|
||||
|
||||
public void run(Object arg);
|
||||
public abstract class Tasklet {
|
||||
|
||||
private String description;
|
||||
private boolean started;
|
||||
private String progress;
|
||||
|
||||
public Tasklet(String description){
|
||||
this.description = description;
|
||||
}
|
||||
public Tasklet(){
|
||||
this.description = "anonymous";
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public boolean isStarted() {
|
||||
return started;
|
||||
}
|
||||
public void setStarted(boolean started) {
|
||||
this.started = started;
|
||||
}
|
||||
|
||||
public String getProgress() {
|
||||
return progress;
|
||||
}
|
||||
public void setProgress(String progress) {
|
||||
this.progress = progress;
|
||||
}
|
||||
|
||||
public abstract void run();
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("%s %s %s",description,isStarted() ? "läuft" : "wartet", (this.progress==null) ? "" : String.format("[%s]", this.progress));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
package org.hwo.tasklet;
|
||||
|
||||
public interface TaskletListener {
|
||||
|
||||
void taskletQueued(TaskletManager manager,Tasklet tasklet);
|
||||
void taskletStarted(TaskletManager manager,Tasklet tasklet);
|
||||
void taskletFinished(TaskletManager manager,Tasklet tasklet);
|
||||
void taskletProgressChanged(TaskletManager manager,Tasklet tasklet);
|
||||
}
|
|
@ -0,0 +1,128 @@
|
|||
package org.hwo.tasklet;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
public class TaskletManager {
|
||||
|
||||
private static TaskletManager _TaskletManager = new TaskletManager();
|
||||
public static TaskletManager instance(){
|
||||
return _TaskletManager;
|
||||
}
|
||||
|
||||
List<TaskletListener> taskletListeners;
|
||||
List<TaskletThread> taskletThreads;
|
||||
|
||||
List<Tasklet> tasklets;
|
||||
|
||||
int threads;
|
||||
boolean shuttingDown;
|
||||
|
||||
public TaskletManager(){
|
||||
taskletListeners = new LinkedList<TaskletListener>();
|
||||
taskletThreads = new LinkedList<TaskletThread>();
|
||||
tasklets = new LinkedList<Tasklet>();
|
||||
threads = 1;
|
||||
}
|
||||
|
||||
public synchronized void addTaskletListener(TaskletListener listener){
|
||||
taskletListeners.add(listener);
|
||||
}
|
||||
public synchronized void removeTaskletListener(TaskletListener listener){
|
||||
taskletListeners.remove(listener);
|
||||
}
|
||||
|
||||
public synchronized int getThreads() {
|
||||
return threads;
|
||||
}
|
||||
public synchronized void setThreads(int threads) {
|
||||
this.threads = threads;
|
||||
}
|
||||
|
||||
public synchronized void fireTaskletQueued(Tasklet tasklet){
|
||||
for (TaskletListener l:taskletListeners)
|
||||
l.taskletQueued(this, tasklet);
|
||||
}
|
||||
public synchronized void fireTaskletStarted(Tasklet tasklet){
|
||||
for (TaskletListener l:taskletListeners)
|
||||
l.taskletStarted(this, tasklet);
|
||||
}
|
||||
public synchronized void fireTaskletFinished(Tasklet tasklet){
|
||||
for (TaskletListener l:taskletListeners)
|
||||
l.taskletFinished(this, tasklet);
|
||||
}
|
||||
public synchronized void fireTaskletProgressChanged(Tasklet tasklet){
|
||||
for (TaskletListener l:taskletListeners)
|
||||
l.taskletProgressChanged(this, tasklet);
|
||||
}
|
||||
|
||||
public synchronized void enqueue(Tasklet tasklet){
|
||||
if (taskletThreads.size() < threads){
|
||||
taskletThreads.add(new TaskletThread(this));
|
||||
}
|
||||
|
||||
tasklets.add(tasklet);
|
||||
fireTaskletQueued(tasklet);
|
||||
|
||||
this.notify();
|
||||
}
|
||||
|
||||
public synchronized Tasklet pop(){
|
||||
if (tasklets.size()>0)
|
||||
return tasklets.remove(0);
|
||||
return null;
|
||||
}
|
||||
|
||||
public int getThreadPoolSize(){
|
||||
return taskletThreads.size();
|
||||
}
|
||||
|
||||
public void shutdown(){
|
||||
synchronized (this) {
|
||||
shuttingDown = true;
|
||||
setThreads(0);
|
||||
}
|
||||
|
||||
while (taskletThreads.size() > 0){
|
||||
try {
|
||||
Thread.sleep(50);
|
||||
synchronized (this) {
|
||||
this.notifyAll();
|
||||
}
|
||||
|
||||
} catch (InterruptedException ex){
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isShuttingDown() {
|
||||
return shuttingDown;
|
||||
}
|
||||
|
||||
public synchronized void removeTaskletThread(TaskletThread taskletThread){
|
||||
taskletThreads.remove(taskletThread);
|
||||
}
|
||||
|
||||
private Tasklet findTasklet(){
|
||||
for (TaskletThread thread: this.taskletThreads){
|
||||
if (Thread.currentThread().equals(thread)){
|
||||
return thread.getCurrentTasklet();
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public synchronized void setProgress(double percentage){
|
||||
setProgress(String.format("%d%%", new Double(percentage * 100).intValue()));
|
||||
}
|
||||
|
||||
public synchronized void setProgress(String progress){
|
||||
Tasklet c = findTasklet();
|
||||
if (c != null){
|
||||
c.setProgress(progress);
|
||||
fireTaskletProgressChanged(c);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -7,62 +7,65 @@ import java.util.Stack;
|
|||
import org.hwo.fifo.FiFo;
|
||||
|
||||
public class TaskletThread extends Thread {
|
||||
|
||||
private class QueuedTasklet
|
||||
{
|
||||
private Tasklet tasklet;
|
||||
private Object argument;
|
||||
TaskletManager manager;
|
||||
Tasklet currentTasklet;
|
||||
|
||||
public TaskletThread(TaskletManager manager) {
|
||||
this.manager = manager;
|
||||
this.currentTasklet = null;
|
||||
|
||||
public QueuedTasklet(Tasklet tasklet,Object argument)
|
||||
{
|
||||
this.tasklet = tasklet;
|
||||
this.argument = argument;
|
||||
}
|
||||
}
|
||||
|
||||
private FiFo<QueuedTasklet> queuedTasklets = new FiFo<QueuedTasklet>();
|
||||
|
||||
public TaskletThread() {
|
||||
start();
|
||||
}
|
||||
|
||||
public void queue(Tasklet tasklet,Object arg)
|
||||
{
|
||||
synchronized (queuedTasklets) {
|
||||
queuedTasklets.push(new QueuedTasklet(tasklet,arg));
|
||||
}
|
||||
queuedTasklets.notify();
|
||||
public Tasklet getCurrentTasklet() {
|
||||
return currentTasklet;
|
||||
}
|
||||
|
||||
private void removeFromManager(){
|
||||
manager.removeTaskletThread(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
while (true)
|
||||
{
|
||||
QueuedTasklet queuedTasklet = null;
|
||||
Tasklet tasklet = manager.pop();
|
||||
|
||||
synchronized (queuedTasklets) {
|
||||
while (tasklet != null){
|
||||
tasklet.setStarted(true);
|
||||
manager.fireTaskletStarted(tasklet);
|
||||
currentTasklet = tasklet;
|
||||
try {
|
||||
queuedTasklets.wait(100);
|
||||
queuedTasklet = queuedTasklets.pull();
|
||||
} catch (InterruptedException e) {
|
||||
tasklet.run();
|
||||
} catch (Exception e){
|
||||
System.err.println("Tasklet threw Exception:");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
currentTasklet = null;
|
||||
tasklet.setStarted(false);
|
||||
manager.fireTaskletFinished(tasklet);
|
||||
|
||||
tasklet = manager.pop();
|
||||
}
|
||||
|
||||
if (queuedTasklet != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
queuedTasklet.tasklet.run(queuedTasklet.argument);
|
||||
} catch (Exception ex)
|
||||
{
|
||||
System.err.println("Tasklet throwed Exception: " + ex.toString());
|
||||
synchronized (manager) {
|
||||
try {
|
||||
if (manager.getThreadPoolSize() > manager.getThreads()){
|
||||
removeFromManager();
|
||||
return;
|
||||
}
|
||||
|
||||
manager.wait();
|
||||
} catch (InterruptedException ex){
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (isInterrupted())
|
||||
if (manager.isShuttingDown()){
|
||||
removeFromManager();
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue