package net.minecraft.world.storage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ThreadedFileIOBase implements Runnable
{
/** Instance of ThreadedFileIOBase */
public static final ThreadedFileIOBase threadedIOInstance = new ThreadedFileIOBase();
private List threadedIOQueue = Collections.synchronizedList(new ArrayList());
private volatile long writeQueuedCounter = 0L;
private volatile long savedIOCounter = 0L;
private volatile boolean isThreadWaiting = false;
private ThreadedFileIOBase()
{
Thread var1 = new Thread(this, "File IO Thread");
var1.setPriority(1);
var1.start();
}
public void run()
{
while (true)
{
this.processQueue();
}
}
/**
* Process the items that are in the queue
*/
private void processQueue()
{
for (int var1 = 0; var1 < this.threadedIOQueue.size(); ++var1)
{
IThreadedFileIO var2 = (IThreadedFileIO)this.threadedIOQueue.get(var1);
boolean var3 = var2.writeNextIO();
if (!var3)
{
this.threadedIOQueue.remove(var1--);
++this.savedIOCounter;
}
try
{
Thread.sleep(this.isThreadWaiting ? 0L : 10L);
}
catch (InterruptedException var6)
{
var6.printStackTrace();
}
}
if (this.threadedIOQueue.isEmpty())
{
try
{
Thread.sleep(25L);
}
catch (InterruptedException var5)
{
var5.printStackTrace();
}
}
}
/**
* threaded io
*/
public void queueIO(IThreadedFileIO par1IThreadedFileIO)
{
if (!this.threadedIOQueue.contains(par1IThreadedFileIO))
{
++this.writeQueuedCounter;
this.threadedIOQueue.add(par1IThreadedFileIO);
}
}
public void waitForFinish() throws InterruptedException
{
this.isThreadWaiting = true;
while (this.writeQueuedCounter != this.savedIOCounter)
{
Thread.sleep(10L);
}
this.isThreadWaiting = false;
}
}