Added TaskManager
- Working on modules system
This commit is contained in:
parent
513feb1093
commit
3859db5b27
@ -111,7 +111,9 @@ switch (OperatingSystem.current()) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation platform("org.lwjgl:lwjgl-bom:$lwjglVersion")
|
|
||||||
|
implementation 'org.jetbrains:annotations:20.1.0'
|
||||||
|
implementation platform("org.lwjgl:lwjgl-bom:$lwjglVersion")
|
||||||
|
|
||||||
implementation "org.lwjgl:lwjgl"
|
implementation "org.lwjgl:lwjgl"
|
||||||
implementation "org.lwjgl:lwjgl-glfw"
|
implementation "org.lwjgl:lwjgl-glfw"
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
package ru.windcorp.progressia;
|
package ru.windcorp.progressia;
|
||||||
|
|
||||||
|
import ru.windcorp.progressia.common.modules.Task;
|
||||||
|
import ru.windcorp.progressia.common.modules.TaskManager;
|
||||||
import ru.windcorp.progressia.common.util.crash.CrashReports;
|
import ru.windcorp.progressia.common.util.crash.CrashReports;
|
||||||
import ru.windcorp.progressia.common.util.crash.analyzers.OutOfMemoryAnalyzer;
|
import ru.windcorp.progressia.common.util.crash.analyzers.OutOfMemoryAnalyzer;
|
||||||
import ru.windcorp.progressia.common.util.crash.providers.*;
|
import ru.windcorp.progressia.common.util.crash.providers.*;
|
||||||
@ -30,6 +32,7 @@ public class ProgressiaLauncher {
|
|||||||
arguments = args.clone();
|
arguments = args.clone();
|
||||||
setupCrashReports();
|
setupCrashReports();
|
||||||
proxy.initialize();
|
proxy.initialize();
|
||||||
|
TaskManager.startLoading();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setupCrashReports() {
|
private static void setupCrashReports() {
|
||||||
|
@ -25,6 +25,9 @@ public class Module extends Namespaced {
|
|||||||
public List<Task> getTasks() {
|
public List<Task> getTasks() {
|
||||||
return tasks;
|
return tasks;
|
||||||
}
|
}
|
||||||
|
public void addTask(Task task) {
|
||||||
|
tasks.add(task);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return false - not all tasks are done
|
* @return false - not all tasks are done
|
||||||
|
@ -12,7 +12,8 @@ public abstract class Task
|
|||||||
implements Runnable
|
implements Runnable
|
||||||
{
|
{
|
||||||
|
|
||||||
private boolean done = false;
|
private boolean isDone = false;
|
||||||
|
private boolean isActive = false;
|
||||||
|
|
||||||
List<Task> requiredTasks = new ArrayList<>();
|
List<Task> requiredTasks = new ArrayList<>();
|
||||||
|
|
||||||
@ -34,20 +35,23 @@ public abstract class Task
|
|||||||
throw CrashReports.report(new Throwable(),
|
throw CrashReports.report(new Throwable(),
|
||||||
"The following required Tasks are not done:\n%s",
|
"The following required Tasks are not done:\n%s",
|
||||||
StringUtil.iterableToString(undoneTasks, "\n"));
|
StringUtil.iterableToString(undoneTasks, "\n"));
|
||||||
|
} else {
|
||||||
|
perform();
|
||||||
|
isDone = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
perform();
|
|
||||||
|
|
||||||
done = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method will be invoked by Run()
|
// This method will be invoked by Run()
|
||||||
protected abstract void perform();
|
protected abstract void perform();
|
||||||
|
|
||||||
public boolean isDone() {
|
public boolean isDone() {
|
||||||
return done;
|
return isDone;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isActive() { return isActive; }
|
||||||
|
|
||||||
|
public void setActive(boolean value) { isActive = value; }
|
||||||
|
|
||||||
public boolean canRun() {
|
public boolean canRun() {
|
||||||
for (Task t : requiredTasks) {
|
for (Task t : requiredTasks) {
|
||||||
if (!t.isDone()) return false;
|
if (!t.isDone()) return false;
|
||||||
|
@ -0,0 +1,101 @@
|
|||||||
|
package ru.windcorp.progressia.common.modules;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.concurrent.ExecutorService;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ThreadFactory;
|
||||||
|
|
||||||
|
public class TaskManager {
|
||||||
|
private static final List<Task> tasks = new ArrayList<>();
|
||||||
|
private static final List<Module> modules = new ArrayList<>();
|
||||||
|
private static final ThreadFactory threadFactory = new ThreadFactoryBuilder()
|
||||||
|
.setNameFormat("LogicCore-%d")
|
||||||
|
.build();
|
||||||
|
|
||||||
|
//Thread pool with size of logical cores of CPU
|
||||||
|
private static final ExecutorService executorService =
|
||||||
|
Executors.newFixedThreadPool(
|
||||||
|
Runtime.getRuntime().availableProcessors()
|
||||||
|
, threadFactory);
|
||||||
|
|
||||||
|
public static void registerModule(Module module) {
|
||||||
|
tasks.addAll(module.getTasks());
|
||||||
|
modules.add(module);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void startLoading() {
|
||||||
|
Module mod = new Module("Module:Mod");
|
||||||
|
Task task = new Task("Task:Task") {
|
||||||
|
@Override
|
||||||
|
protected void perform() {
|
||||||
|
int i = 0;
|
||||||
|
while(i < 1000000) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
System.out.println("Task " + getId() + "has been performed by" + Thread.currentThread().getName());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Task task1 = new Task("Task:Task1") {
|
||||||
|
@Override
|
||||||
|
protected void perform() {
|
||||||
|
int i = 0;
|
||||||
|
while(i < 1000000) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
System.out.println("Task " + getId() + "has been performed by" + Thread.currentThread().getName());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Task task2 = new Task("Task:Task2") {
|
||||||
|
@Override
|
||||||
|
protected void perform() {
|
||||||
|
int i = 0;
|
||||||
|
while(i < 1000000) {
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
System.out.println("Task " + getId() + "has been performed by" + Thread.currentThread().getName());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
mod.addTask(task);
|
||||||
|
mod.addTask(task1);
|
||||||
|
mod.addTask(task2);
|
||||||
|
registerModule(mod);
|
||||||
|
|
||||||
|
while (!tasks.isEmpty()) {
|
||||||
|
executorService.submit(() -> {
|
||||||
|
while (true) {
|
||||||
|
Task t = getRunnableTask();
|
||||||
|
if(t == null) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (!t.isActive()) {
|
||||||
|
t.setActive(true);
|
||||||
|
removeTask(t);
|
||||||
|
t.run();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
System.out.println(Thread.currentThread().getName() + " has been stopped!");
|
||||||
|
Thread.yield();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
executorService.shutdownNow();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void removeTask(Task task) {
|
||||||
|
synchronized (tasks) {
|
||||||
|
tasks.remove(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Task getRunnableTask() {
|
||||||
|
synchronized (tasks) {
|
||||||
|
for (Task t : tasks) {
|
||||||
|
if (t.canRun()) return t;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user