導入java.util.Collection;
導入 java.util.Vector;
/**
* 任務分發器
*/
公共類 TaskManage 擴充 Thread
{
protected Vector<Runnable> 任務 = new Vector<Runnable>();
受保護的布林運作= false;
受保護的布林值已停止= false;
受保護的布林值暫停= false;
受保護的布林值被殺死= false;
私有ThreadPool池;
公共任務管理(執行緒池池)
{
this.pool = 池;
}
公共無效putTask(可運行任務)
{
任務.add(任務);
}
公共無效putTasks(Runnable []任務)
{
for (int i = 0; i < 任務.length; i++)
this.tasks.add(tasks[i]);
}
public void putTasks(Collection<Runnable> 任務)
{
this.tasks.addAll(任務);
}
受保護的可運行 popTask()
{
if (tasks.size() > 0) return (Runnable)tasks.remove(0);
否則返回空;
}
公共布爾 isRunning()
{
返回運行;
}
公共無效停止任務()
{
停止=真;
}
公共無效stopTasksSync()
{
停止任務();
while (正在運行())
{
嘗試
{
睡眠(5);
}
捕獲(InterruptedException e)
{
TaskException.getResultMessage(e);
}
}
}
公共無效暫停任務()
{
暫停=真;
}
公共無效暫停任務同步()
{
暫停任務();
while (正在運行())
{
嘗試
{
睡眠(5);
}
捕獲(InterruptedException e)
{
TaskException.getResultMessage(e);
}
}
}
公共無效殺死()
{
如果(!運行)中斷();
否則被殺=真;
}
公共無效killSync()
{
殺();
while (isAlive())
{
嘗試
{
睡眠(5);
}
捕獲(InterruptedException e)
{
TaskException.getResultMessage(e);
}
}
}
公共同步無效startTasks()
{
運行=真;
this.notify();
}
公共同步無效運行()
{
嘗試
{
而(真)
{
if (!running ||tasks.size() == 0)
{
pool.notifyForIdleThread();
this.wait();
}
別的
{
可運行的任務;
while ((任務 = popTask()) != null)
{
任務.run();
如果(停止)
{
停止=假;
if (tasks.size() > 0)
{
任務.clear();
System.out.println(Thread.currentThread().getId() + ": 任務已停止");
休息;
}
}
如果(暫停)
{
暫停=假;
if (tasks.size() > 0)
{
System.out.println(Thread.currentThread().getId() + ": 任務已暫停");
休息;
}
}
}
運行=假;
}
如果(被殺)
{
被殺=假;
休息;
}
}
}
捕獲(InterruptedException e)
{
TaskException.getResultMessage(e);
返回;
}
}
}
導入java.util.Collection;
導入 java.util.Iterator;
導入 java.util.Vector;
/**
* 執行緒池
*/
公共類別線程池
{
protected int maxPoolSize = TaskConfig.maxPoolSize;
protected int initPoolSize = TaskConfig.initPoolSize;
protected Vector<TaskManage> 執行緒 = new Vector<TaskManage>();
受保護的布林值初始化= false;
受保護的布林值 hasIdleThread = false;
公共線程池()
{
極好的();
}
公共線程池(int maxPoolSize,int initPoolSize)
{
this.maxPoolSize = maxPoolSize;
this.initPoolSize = initPoolSize;
}
公共無效初始化()
{
初始化=真;
for (int i = 0; i < initPoolSize; i++)
{
TaskManage 線程 = new TaskManage(this);
線程.start();
線程.add(線程);
}
}
公有無效setMaxPoolSize(int maxPoolSize)
{
this.maxPoolSize = maxPoolSize;
if (maxPoolSize < getPoolSize()) setPoolSize(maxPoolSize);
}
/**
* 重設目前線程數若需殺掉某個線程,線程不會立即殺掉,會等待線程中的事
* 事務處理完成但此方法會重新從線程池中刪除該線程,不會等待事務處理結束
*/
公有無效setPoolSize(int大小)
{
if (!初始化)
{
initPoolSize = 大小;
返回;
}
否則如果(大小> getPoolSize())
{
for (int i = getPoolSize(); i < 大小 && i < maxPoolSize; i++)
{
TaskManage 線程 = new TaskManage(this);
線程.start();
線程.add(線程);
}
}
else if (大小 < getPoolSize())
{
while (getPoolSize() > 大小)
{
TaskManage th = (TaskManage)threads.remove(0);
th.kill();
}
}
}
公有 int getPoolSize()
{
返回線程.size();
}
受保護的無效notifyForIdleThread()
{
有空閒線程 = true;
}
受保護的布林 waitForIdleThread()
{
有空閒線程 = false;
while (!hasIdleThread && getPoolSize() >= maxPoolSize)
{
嘗試
{
線程.sleep(5);
}
捕獲(InterruptedException e)
{
TaskException.getResultMessage(e);
返回假;
}
}
返回真;
}
公共同步任務管理 getIdleThread()
{
而(真)
{
for (Iterator<TaskManage> itr =threads.iterator(); itr.hasNext();)
{
TaskManage th = (TaskManage) itr.next();
if (!th.isRunning()) 回傳 th;
}
if (getPoolSize() < maxPoolSize)
{
TaskManage 線程 = new TaskManage(this);
線程.start();
線程.add(線程);
返回線程;
}
if (waitForIdleThread() == false) 回傳 null;
}
}
公共無效processTask(可運行任務)
{
TaskManage th = getIdleThread();
if (th != null)
{
th.putTask(任務);
th.startTasks();
}
}
公共無效processTasksInSingleThread(Runnable []任務)
{
TaskManage th = getIdleThread();
if (th != null)
{
th.putTasks(任務);
th.startTasks();
}
}
公共無效 processTasksInSingleThread(Collection<Runnable> 任務)
{
TaskManage th = getIdleThread();
if (th != null)
{
th.putTasks(任務);
th.startTasks();
}
}
}
公共類別 TopTask 實作 Runnable
{
私有ThreadPool池;
公共 TopTask()
{
極好的();
}
公共TopTask(線程池池)
{
極好的();
this.pool = 池;
}
@覆蓋
公共無效運行()
{
初始化();
開始();
}
/**
* 初始化驗證權限、參數之類
*/
公共無效初始化()
{
}
/**
* 開始自動任務
*/
公共無效開始()
{
for (int i = 0; i < 10; i++)
{
pool.processTask(new BeginAuto());
}
}
}
/**
* 實作類別
*/
類別 BeginAuto 實作 Runnable
{
@覆蓋
公共無效運行()
{
System.out.println(Thread.currentThread().getId() + ".................");
}
}