java中通用的線程池實例代碼
package com.smart.frame.task.autoTask;
import java.util.Collection;
import java.util.Vector;
/**
* 任務(wù)分發(fā)器
*/
public class TaskManage extends Thread
{
protected Vector<Runnable> tasks = new Vector<Runnable>();
protected boolean running = false;
protected boolean stopped = false;
protected boolean paused = false;
protected boolean killed = false;
private ThreadPool pool;
public TaskManage(ThreadPool pool)
{
this.pool = pool;
}
public void putTask(Runnable task)
{
tasks.add(task);
}
public void putTasks(Runnable[] tasks)
{
for (int i = 0; i < tasks.length; i++)
this.tasks.add(tasks[i]);
}
public void putTasks(Collection<Runnable> tasks)
{
this.tasks.addAll(tasks);
}
protected Runnable popTask()
{
if (tasks.size() > 0) return (Runnable) tasks.remove(0);
else return null;
}
public boolean isRunning()
{
return running;
}
public void stopTasks()
{
stopped = true;
}
public void stopTasksSync()
{
stopTasks();
while (isRunning())
{
try
{
sleep(5);
}
catch (InterruptedException e)
{
TaskException.getResultMessage(e);
}
}
}
public void pauseTasks()
{
paused = true;
}
public void pauseTasksSync()
{
pauseTasks();
while (isRunning())
{
try
{
sleep(5);
}
catch (InterruptedException e)
{
TaskException.getResultMessage(e);
}
}
}
public void kill()
{
if (!running) interrupt();
else killed = true;
}
public void killSync()
{
kill();
while (isAlive())
{
try
{
sleep(5);
}
catch (InterruptedException e)
{
TaskException.getResultMessage(e);
}
}
}
public synchronized void startTasks()
{
running = true;
this.notify();
}
public synchronized void run()
{
try
{
while (true)
{
if (!running || tasks.size() == 0)
{
pool.notifyForIdleThread();
this.wait();
}
else
{
Runnable task;
while ((task = popTask()) != null)
{
task.run();
if (stopped)
{
stopped = false;
if (tasks.size() > 0)
{
tasks.clear();
System.out.println(Thread.currentThread().getId() + ": Tasks are stopped");
break;
}
}
if (paused)
{
paused = false;
if (tasks.size() > 0)
{
System.out.println(Thread.currentThread().getId() + ": Tasks are paused");
break;
}
}
}
running = false;
}
if (killed)
{
killed = false;
break;
}
}
}
catch (InterruptedException e)
{
TaskException.getResultMessage(e);
return;
}
}
}
package com.smart.frame.task.autoTask;
import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;
/**
* 線程池
*/
public class ThreadPool
{
protected int maxPoolSize = TaskConfig.maxPoolSize;
protected int initPoolSize = TaskConfig.initPoolSize;
protected Vector<TaskManage> threads = new Vector<TaskManage>();
protected boolean initialized = false;
protected boolean hasIdleThread = false;
public ThreadPool()
{
super();
}
public ThreadPool(int maxPoolSize, int initPoolSize)
{
this.maxPoolSize = maxPoolSize;
this.initPoolSize = initPoolSize;
}
public void init()
{
initialized = true;
for (int i = 0; i < initPoolSize; i++)
{
TaskManage thread = new TaskManage(this);
thread.start();
threads.add(thread);
}
}
public void setMaxPoolSize(int maxPoolSize)
{
this.maxPoolSize = maxPoolSize;
if (maxPoolSize < getPoolSize()) setPoolSize(maxPoolSize);
}
/**
* 重設(shè)當(dāng)前線程數(shù) 若需殺掉某線程,線程不會立刻殺掉,而會等到線程中的事
* 務(wù)處理完成 但此方法會立刻從線程池中移除該線程,不會等待事務(wù)處理結(jié)束
*/
public void setPoolSize(int size)
{
if (!initialized)
{
initPoolSize = size;
return;
}
else if (size > getPoolSize())
{
for (int i = getPoolSize(); i < size && i < maxPoolSize; i++)
{
TaskManage thread = new TaskManage(this);
thread.start();
threads.add(thread);
}
}
else if (size < getPoolSize())
{
while (getPoolSize() > size)
{
TaskManage th = (TaskManage) threads.remove(0);
th.kill();
}
}
}
public int getPoolSize()
{
return threads.size();
}
protected void notifyForIdleThread()
{
hasIdleThread = true;
}
protected boolean waitForIdleThread()
{
hasIdleThread = false;
while (!hasIdleThread && getPoolSize() >= maxPoolSize)
{
try
{
Thread.sleep(5);
}
catch (InterruptedException e)
{
TaskException.getResultMessage(e);
return false;
}
}
return true;
}
public synchronized TaskManage getIdleThread()
{
while (true)
{
for (Iterator<TaskManage> itr = threads.iterator(); itr.hasNext();)
{
TaskManage th = (TaskManage) itr.next();
if (!th.isRunning()) return th;
}
if (getPoolSize() < maxPoolSize)
{
TaskManage thread = new TaskManage(this);
thread.start();
threads.add(thread);
return thread;
}
if (waitForIdleThread() == false) return null;
}
}
public void processTask(Runnable task)
{
TaskManage th = getIdleThread();
if (th != null)
{
th.putTask(task);
th.startTasks();
}
}
public void processTasksInSingleThread(Runnable[] tasks)
{
TaskManage th = getIdleThread();
if (th != null)
{
th.putTasks(tasks);
th.startTasks();
}
}
public void processTasksInSingleThread(Collection<Runnable> tasks)
{
TaskManage th = getIdleThread();
if (th != null)
{
th.putTasks(tasks);
th.startTasks();
}
}
}
package com.smart.frame.task.autoTask;
public class TopTask implements Runnable
{
private ThreadPool pool;
public TopTask()
{
super();
}
public TopTask(ThreadPool pool)
{
super();
this.pool = pool;
}
@Override
public void run()
{
init();
start();
}
/**
* 初始化驗證權(quán)限、參數(shù)之類
*/
public void init()
{
}
/**
* 開始自動任務(wù)
*/
public void start()
{
for (int i = 0; i < 10; i++)
{
pool.processTask(new BeginAuto());
}
}
}
/**
* 實現(xiàn)類
*/
class BeginAuto implements Runnable
{
@Override
public void run()
{
System.out.println(Thread.currentThread().getId() + "..................");
}
}
相關(guān)文章
MyBatis的注解使用、ORM層優(yōu)化方式(懶加載和緩存)
這篇文章主要介紹了MyBatis的注解使用、ORM層優(yōu)化方式(懶加載和緩存),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10java中判斷字段真實長度的實例(中文2個字符,英文1個字符)
下面小編就為大家?guī)硪黄猨ava中判斷字段真實長度的實例(中文2個字符,英文1個字符)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-01-01獲取JPEGImageEncoder和JPEGCode這兩個類的方法
下面小編就為大家?guī)硪黄@取JPEGImageEncoder和JPEGCode這兩個類的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07Spring?MVC和springboot靜態(tài)資源處理問題
這篇文章主要介紹了Spring?MVC和springboot靜態(tài)資源處理問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08