Я хотел бы провести одну-единственную длительную операцию и иметь возможность видеть следующие ее этапы:
1) еще не запускался
2) running (бег)
3) закончил нормально
4) закончено за исключением
Я написал приведенный ниже код, который выглядит чрезмерно сложным. Он использует три класса: Work
, ThreadPoolExecutor
, FutureTask<?>
, из которых Work
написано от руки.
Одновременно работа частично дублирует FutureTask<?>
функциональность (сохранение исключений, что тоже сделано в Future
, но закрыто внутри).
Возникает вопрос: есть ли способ сделать то же самое с помощью нескольких строк для предопределенных классов из Java, Groovy, GPars, Apache и т. Д.?
Код:
public class AsyncRunAndTrackState {
public static class Stub implements Runnable {
@Override
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static class Work implements Runnable {
private Exception exception;
private boolean active;
public synchronized Exception getException() {
return exception;
}
public synchronized void setException(Exception exception) {
this.exception = exception;
}
public synchronized boolean isActive() {
return active;
}
public synchronized void setActive(boolean active) {
this.active = active;
}
@Override
public final void run() {
setActive(true);
setException(null);
try {
runImpl();
}
catch (Exception e) {
setException(e);
}
finally {
setActive(false);
}
}
protected void runImpl() {
System.out.println("Before");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
throw new RuntimeException("Some exception occurred");
//System.out.println("After");
}
}
static ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(1);
static FutureTask<?> future;
static Work work;
public static void main(String[] args) {
for(int i=0; i<10; ++i) {
executor.submit(new Stub());
}
work = new Work();
future = (FutureTask<?>) executor.submit(work);
while(true) {
System.out.println(String.format("future.done = %s, future.cancelled = %s", future.isDone(), future.isCancelled()));
System.out.println(String.format("work.active = %s, work.exception = %s", work.isActive(), work.getException()));
System.out.println();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}