package net.minecraft.client.sounds; import java.util.concurrent.locks.LockSupport; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.util.thread.BlockableEventLoop; /** * The SoundEngineExecutor class is responsible for executing sound-related tasks in a separate thread. *
* It extends the BlockableEventLoop class, providing an event loop for managing and executing tasks.
*/
@Environment(EnvType.CLIENT)
public class SoundEngineExecutor extends BlockableEventLoop
* @return The created thread
*/
private Thread createThread() {
Thread thread = new Thread(this::run);
thread.setDaemon(true);
thread.setName("Sound engine");
thread.start();
return thread;
}
@Override
public Runnable wrapRunnable(Runnable runnable) {
return runnable;
}
@Override
protected boolean shouldRun(Runnable runnable) {
return !this.shutdown;
}
@Override
protected Thread getRunningThread() {
return this.thread;
}
/**
* The main run loop of the SoundEngineExecutor.
* It continuously blocks until the shutdown state is true.
*/
private void run() {
while (!this.shutdown) {
this.managedBlock(() -> this.shutdown);
}
}
@Override
protected void waitForTasks() {
LockSupport.park("waiting for tasks");
}
/**
* Flushes the SoundEngineExecutor by interrupting the thread, joining the thread, dropping all pending tasks, and recreating the thread.
* It sets the shutdown state to false to allow new tasks to be scheduled.
*/
public void flush() {
this.shutdown = true;
this.thread.interrupt();
try {
this.thread.join();
} catch (InterruptedException var2) {
Thread.currentThread().interrupt();
}
this.dropAllTasks();
this.shutdown = false;
this.thread = this.createThread();
}
}