java에서 통용되는 스레드 탱크 실례 코드
package com.smart.frame.task.autoTask;
import java.util.Collection;
import java.util.Vector;
/**
*
*/
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);
}
/**
* , ,
* ,
*/
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();
}
/**
* 、
*/
public void init()
{
}
/**
*
*/
public void start()
{
for (int i = 0; i < 10; i++)
{
pool.processTask(new BeginAuto());
}
}
}
/**
*
*/
class BeginAuto implements Runnable
{
@Override
public void run()
{
System.out.println(Thread.currentThread().getId() + "..................");
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ybatis 공통 Mapper 소개 및 사용 상세 정보Mybatis를 사용하는 개발자들은 대부분 많은 SQL을 xml 파일에 쓰려고 하는데 특수한 업무 논리 SQL을 제외하고 구조와 유사한 추가 삭제 수정 SQL이 대량으로 있다.그리고 데이터베이스 테이블 구조가 변경될...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.