mirror of
https://github.com/Mercury-Language/mercury.git
synced 2025-12-12 12:26:29 +00:00
85 lines
1.8 KiB
Java
85 lines
1.8 KiB
Java
// vim: ts=4 sw=4 expandtab ft=java
|
|
//
|
|
// Copyright (C) 2014, 2018 The Mercury Team
|
|
// This file is distributed under the terms specified in COPYING.LIB.
|
|
//
|
|
|
|
package jmercury.runtime;
|
|
|
|
/**
|
|
* Task is a task being managed by MercuryThreadPool.
|
|
* Callers can use this object to wait for the task's completion.
|
|
*/
|
|
public class Task implements Runnable
|
|
{
|
|
private static long next_id;
|
|
|
|
private long id;
|
|
private Runnable target;
|
|
private Status status;
|
|
|
|
public enum Status {
|
|
NEW,
|
|
SCHEDULED,
|
|
RUNNING,
|
|
FINISHED
|
|
}
|
|
|
|
/**
|
|
* Create a new task.
|
|
*/
|
|
public Task(Runnable target) {
|
|
id = allocateTaskId();
|
|
this.target = target;
|
|
status = Status.NEW;
|
|
}
|
|
|
|
private static synchronized long allocateTaskId() {
|
|
return next_id++;
|
|
}
|
|
|
|
public void run() {
|
|
updateStatus(Status.RUNNING);
|
|
target.run();
|
|
updateStatus(Status.FINISHED);
|
|
}
|
|
|
|
public long getId() {
|
|
return id;
|
|
}
|
|
|
|
public void scheduled() {
|
|
updateStatus(Status.SCHEDULED);
|
|
}
|
|
|
|
/**
|
|
* Update the task's status and notify any threads waiting on the
|
|
* status change.
|
|
*/
|
|
protected synchronized void updateStatus(Status status) {
|
|
if (MercuryThreadPool.debug) {
|
|
System.err.println("Thread: " + Thread.currentThread() +
|
|
"task: " + this + " status " + status);
|
|
}
|
|
this.status = status;
|
|
notifyAll();
|
|
}
|
|
|
|
/**
|
|
* Wait for the task to complete.
|
|
* This waits on the task's monitor. Callers should not be holding
|
|
* any other monitors.
|
|
*/
|
|
public synchronized void waitForTask()
|
|
throws InterruptedException
|
|
{
|
|
while (status != Status.FINISHED) {
|
|
wait();
|
|
}
|
|
}
|
|
|
|
public String toString() {
|
|
return "Task " + id;
|
|
}
|
|
}
|