- 浏览: 11186 次
- 性别:
- 来自: 北京
最新评论
-
cuishen:
libo_591 写道用stop方法停掉线程,不会产生什么问题 ...
线程池示例代码版本2 -
winc218:
我是来顶楼主的,我的项目中正好需要这样的一个线程池
线程池示例代码版本2 -
libo_591:
用stop方法停掉线程,不会产生什么问题么?
急盼回复,因为在 ...
线程池示例代码版本2 -
fjlyxx:
允许的话 可以把你的代码发给我学习下...fjlyxx@gma ...
线程池示例代码版本2 -
sfjsffjjj:
to fjlyxx兄:
引用sfjsffjjj 写道
现在线程 ...
线程池示例代码版本2
包结构
src
test
TestThreadPool 测试类
thread
ThreadPool 线程池类
WorkThread 工作线程类
TaskMonitorThread 任务监测线程类
TaskTimeOutThread 任务超时监测线程类
task
TaskManager 任务管理器
WorkTask 任务接口
WorkTaskImp 正常任务类
WorkTaskAImp 异常任务类
WorkTaskBImp 超时任务类
event
AbstractEvent 任务事件类
BeginTaskEvent 任务执行开始事件类
EndTaskEvent 任务执行结束事件类
TaskRunTime 任务运行时间类
TaskTimeOutEvent 任务执行超时事件类
源代码
运行结果
开始初始化线程池...
正在创建工作线程...线程编号0
正在创建工作线程...线程编号1
正在创建工作线程...线程编号2
正在创建工作线程...线程编号3
正在创建工作线程...线程编号4
正在创建工作线程...线程编号5
正在创建工作线程...线程编号6
正在创建工作线程...线程编号7
正在创建工作线程...线程编号8
正在创建工作线程...线程编号9
正在创建任务监测线程...
结束初始化线程池...
正在执行超时任务1...
执行第0个增加用户操作...工作线程编号1
执行第1个增加用户操作...工作线程编号2
执行第2个增加用户操作...工作线程编号3
执行第3个增加用户操作...工作线程编号4
执行第4个增加用户操作...工作线程编号5
执行第5个增加用户操作...工作线程编号6
执行第6个增加用户操作...工作线程编号7
执行第7个增加用户操作...工作线程编号8
执行第8个增加用户操作...工作线程编号9
执行第9个增加用户操作...工作线程编号1
执行第10个增加用户操作...工作线程编号2
执行第11个增加用户操作...工作线程编号3
执行第12个增加用户操作...工作线程编号4
执行第13个增加用户操作...工作线程编号5
执行第14个增加用户操作...工作线程编号6
执行第15个增加用户操作...工作线程编号7
执行第16个增加用户操作...工作线程编号8
执行第17个增加用户操作...工作线程编号9
执行第18个增加用户操作...工作线程编号1
执行第19个增加用户操作...工作线程编号2
正在执行超时任务2...
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
执行第0个删除用户操作...工作线程编号4
执行第1个删除用户操作...工作线程编号5
执行第2个删除用户操作...工作线程编号6
执行第3个删除用户操作...工作线程编号7
执行第4个删除用户操作...工作线程编号8
执行第5个删除用户操作...工作线程编号9
执行第6个删除用户操作...工作线程编号1
执行第7个删除用户操作...工作线程编号2
执行第8个删除用户操作...工作线程编号4
执行第9个删除用户操作...工作线程编号5
执行第10个删除用户操作...工作线程编号6
执行第11个删除用户操作...工作线程编号7
执行第12个删除用户操作...工作线程编号8
执行第13个删除用户操作...工作线程编号9
正在关闭任务监测线程...
正在关闭超时监测线程...
正在创建工作线程...线程编号11
正在停止工作超时线程...线程编号0
正在创建工作线程...线程编号12
正在停止工作超时线程...线程编号3
正在关闭工作线程...线程编号1
正在关闭工作线程...线程编号2
正在关闭工作线程...线程编号4
正在关闭工作线程...线程编号5
正在关闭工作线程...线程编号6
正在关闭工作线程...线程编号7
正在关闭工作线程...线程编号8
正在关闭工作线程...线程编号9
正在关闭工作线程...线程编号11
正在关闭工作线程...线程编号12
请问一下..哪些地方需要改进?
是否直接使用Executor来直接创建线程池的效率高?
src
test
TestThreadPool 测试类
thread
ThreadPool 线程池类
WorkThread 工作线程类
TaskMonitorThread 任务监测线程类
TaskTimeOutThread 任务超时监测线程类
task
TaskManager 任务管理器
WorkTask 任务接口
WorkTaskImp 正常任务类
WorkTaskAImp 异常任务类
WorkTaskBImp 超时任务类
event
AbstractEvent 任务事件类
BeginTaskEvent 任务执行开始事件类
EndTaskEvent 任务执行结束事件类
TaskRunTime 任务运行时间类
TaskTimeOutEvent 任务执行超时事件类
源代码
package test; import task.TaskManager; import task.WorkTask; import task.WorkTaskAImp; import task.WorkTaskBImp; import task.WorkTaskImp; import thread.ThreadPool; /** * 线程池测试类,测试功能如下: * 1、测试线程池创建功能 * 2、测试处理并发请求功能 * 3、测试关闭功能 **/ public class TestThreadPool { public static void main(String[] args){ //创建线程池,开启处理请求服务 final int threadCount=10; ThreadPool pool=ThreadPool.getInstance(); pool.init(threadCount); //接收客户端请求 WorkTask task1=new WorkTaskBImp("执行超时任务..."); TaskManager.addTask(task1); final int requestCount=20; for(int i=0;i<requestCount;i++){ WorkTask task=new WorkTaskImp("执行第"+i+"个增加用户操作..."); TaskManager.addTask(task); } WorkTask task2=new WorkTaskBImp("执行超时任务..."); TaskManager.addTask(task2); for(int i=0;i<requestCount;i++){ WorkTask task=new WorkTaskAImp("执行第"+i+"个修改用户异常操作..."); TaskManager.addTask(task); } for(int i=0;i<requestCount;i++){ WorkTask task=new WorkTaskImp("执行第"+i+"个删除用户操作..."); TaskManager.addTask(task); } //关闭线程池 try { Thread.sleep(2000);//为了显示处理请求效果 pool.close(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } package thread; import java.util.ArrayList; import java.util.List; import java.util.Vector; import event.BeginTaskEvent; import event.EndTaskEvent; import task.TaskManager; /** * 线程池类,功能如下: * 1、初始化线程池 * 2、获取空闲线程 * 3、任务运行,注册超时监测 * 4、任务结束,注销超时监测 * 5、关闭线程池 */ public class ThreadPool { private int threadcount; private int GetIdleThreadPollTime=50;//获取空闲线程轮询间隔时间,可配置 private static ThreadPool pool=new ThreadPool();//线程实例 private Vector<WorkThread> threadlist=new Vector<WorkThread>();//工作线程列表 private TaskMonitorThread mainThread;//任务监测线程 private TaskTimeOutThread timeThread; //任务超时线程 private boolean StopGetIdleThread=false; //单例模式 private ThreadPool(){ } public static synchronized ThreadPool getInstance(){ return pool; } private void stopGetIdleThread(){ StopGetIdleThread = true; } //初始化线程池 public void init(int count){ System.out.println("开始初始化线程池..."); threadcount=count; for(int i=0;i<count;i++){ WorkThread t=new WorkThread(new Integer(i)); threadlist.add(t); t.start(); } mainThread=new TaskMonitorThread(pool); mainThread.start(); timeThread=new TaskTimeOutThread(pool); timeThread.start(); System.out.println("结束初始化线程池..."); } //获取空闲线程 public WorkThread getIdleThread(){ while(true){ if (StopGetIdleThread) return null; synchronized(threadlist){ for(int i=0;i<threadlist.size();i++){ WorkThread t=(WorkThread)threadlist.get(i); if (t.getMyState().equals(WorkThread.IDlESTATE)){ return t; } } } try { Thread.sleep(GetIdleThreadPollTime);//放弃CPU,若干时间后重新获取空闲线程 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //任务运行,注册监测 public void beginTaskRun(BeginTaskEvent begin){ timeThread.beginTaskRun(begin); } //任务结束,注销监视 public void endTaskRun(EndTaskEvent end){ timeThread.endTaskRun(end); } //从工作线程表中移除线程 public void removeWorkThread(WorkThread t){ threadlist.remove(t); } //添加新的线程 public void addWorkThread(){ synchronized(threadlist){ WorkThread t=new WorkThread(new Integer(++threadcount)); threadlist.add(t); t.start(); } } //关闭线程池 public void close(){ //停止获取空闲线程 stopGetIdleThread(); //关闭任务监测线程,不再接收请求 mainThread.kill(); //关闭超时监测线程 timeThread.kill(); //关闭工作线程,不再处理任务 for(int i=0;i<threadlist.size();i++){ WorkThread t=(WorkThread)threadlist.get(i); t.kill(); } } } package thread; import task.WorkTask; import event.BeginTaskEvent; import event.EndTaskEvent; /** * 工作线程类,功能如下: * 1、执行业务方法,业务参数可动态设置 * 2、自身状态可设置、可获取 * 3、自我唤醒功能 * 4、自杀功能 */ public final class WorkThread extends Thread{ private boolean shutdown=false; private String info; //业务参数 private Object threadKey;//线程标识 private Object lock=new Object();//锁对象 private String state; //线程状态 private int waitExecFinishPollTime=500;//关闭线程时的轮询等待时间,可配置 public static final String CREATESTATE="1";//创建状态 public static final String RUNSTATE="2"; //运行状态 public static final String IDlESTATE="3"; //空闲状态 private WorkTask nowTask; //当前任务 //获取线程标识key public Object getThreadKey() { return threadKey; } //设置线程的任务 public void setWorkTask(WorkTask task){ this.nowTask=task; } //设置是否关闭线程 private void setShutdown(boolean shutdown) { this.shutdown = shutdown; } //设置线程状态 private void setMyState(String state){ this.state=state; } //获取线程状态 public String getMyState(){ return state; } public WorkThread(Object key){ System.out.println("正在创建工作线程...线程编号"+key.toString()); this.threadKey=key; this.state=CREATESTATE; } @Override public synchronized void start() { // TODO Auto-generated method stub super.start(); setMyState(RUNSTATE); } public void run(){ while(true){ try { setMyState(IDlESTATE); synchronized(this){ wait(); /*开始等待,直至被激活*/ } } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (shutdown) break; try{ new BeginTaskEvent(this,Thread.currentThread(),nowTask).execute(); nowTask.execute();//执行业务 new EndTaskEvent(this,Thread.currentThread(),nowTask).execute(); }catch(Exception e){ new EndTaskEvent(this,Thread.currentThread(),nowTask).execute(); System.out.println(e.getMessage()); } } } //重新激活线程 public void activate(){ synchronized(this){ setMyState(RUNSTATE); notify(); } } //关闭线程 public void kill(){ synchronized(this){ if (this.getMyState().equals(IDlESTATE)){//如果线程处于空闲状态,则直接关掉 System.out.println("正在关闭工作线程...线程编号"+threadKey.toString()); this.setShutdown(true); this.activate(); }else if (this.getMyState().equals(RUNSTATE)){//如果线程处于运行状态,则执行完后再关掉 System.out.println("正在等待线程执行业务完成...工作线程编号"+threadKey.toString()); while(this.getMyState().equals(RUNSTATE)){ try { Thread.sleep(waitExecFinishPollTime);//放弃CPU,若干时间后再检查线程状态 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.println("正在关闭工作线程...线程编号"+threadKey.toString()); this.setShutdown(true); this.activate(); } } } } package thread; import task.TaskManager; import task.WorkTask; /** * 任务检测线程类 * 1、自杀功能 */ public final class TaskMonitorThread extends Thread { private ThreadPool threadPool; private int GetWorkTaskPollTime=10;//监测任务轮询时间,可配置 private boolean shutdown=false; public TaskMonitorThread(ThreadPool pool){ System.out.println("正在创建任务监测线程..."); this.threadPool=pool; } private void setShutDown(boolean b){ this.shutdown=b; } @Override public void run() { // TODO Auto-generated method stub while(true){ if (shutdown) break; WorkTask task=TaskManager.getWorkTask();//看是否有任务请求 if (task==null){ try { Thread.sleep(GetWorkTaskPollTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }else{ WorkThread t=threadPool.getIdleThread();//获取空闲线程 if (t==null) break; t.setWorkTask(task);//设置线程任务 task.setTaskThreadKey(t.getThreadKey());//为了显示任务当前线程 t.activate();//激活空闲线程 try { Thread.sleep(GetWorkTaskPollTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } //关闭线程 public void kill(){ System.out.println("正在关闭任务监测线程..."); this.setShutDown(true); } } package thread; import java.util.Vector; import event.BeginTaskEvent; import event.EndTaskEvent; import event.TaskRunTime; import event.TaskTimeOutEvent; /** * 任务超时监测线程类 * 1、任务开始注册 * 2、任务完成注销 * 3、自杀功能 */ public class TaskTimeOutThread extends Thread { private ThreadPool pool; private boolean shutdown=false; private Vector<TaskRunTime> taskruntimelist=new Vector<TaskRunTime>();//运行任务列表 private int pollTime=500; //轮询时间 private int TaskOutTime=2000; //任务过时时间 public TaskTimeOutThread(ThreadPool pool){ this.pool=pool; } @Override public void run() { // TODO Auto-generated method stub while(!shutdown){ synchronized(taskruntimelist){ for(int i=0;i<taskruntimelist.size();i++){ TaskRunTime t=(TaskRunTime) taskruntimelist.get(i); if (t.checkRunTimeOut(TaskOutTime)){ taskruntimelist.remove(i); new TaskTimeOutEvent(t.getEvent()).execute(); break; } } } try { sleep(pollTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //任务运行,开始监测 public void beginTaskRun(BeginTaskEvent begin){ taskruntimelist.add(new TaskRunTime(begin)); } //任务正常结束 public void endTaskRun(EndTaskEvent end){ synchronized(taskruntimelist){ for(int i=0;i<taskruntimelist.size();i++){ BeginTaskEvent begin=((TaskRunTime) taskruntimelist.get(i)).getEvent(); if (begin.equals(end)){ taskruntimelist.remove(i); break; } } } } //自杀 public void kill(){ System.out.println("正在关闭超时监测线程..."); while(taskruntimelist.size()>0){ try { Thread.sleep(pollTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } shutdown=true; } } package task; import java.util.ArrayList; import java.util.List; /** * 任务管理器 * 1、添加任务 * 2、监测是否有新任务 */ public class TaskManager { private static List taskQueue=new ArrayList<WorkTask>(); //任务队列 private TaskManager(){ } //添加任务 public synchronized static void addTask(WorkTask task){ taskQueue.add(task); } //判断是否有任务未执行 public synchronized static WorkTask getWorkTask(){ if (taskQueue.size()>0){ return (WorkTask)taskQueue.remove(0); }else return null; } } package task; /** * 任务接口 * 继承它来定义自己具体的工作任务 */ public interface WorkTask { void execute() throws Exception; //执行工作任务 void setTaskThreadKey(Object key);//设置任务线程编号 } package task; /** * 任务类1 * 正常执行的工作任务 */ public class WorkTaskImp implements WorkTask { protected String param; protected Object threadkey; //为了显示执行线程编号 protected final int TaskExecTime=500; //任务执行时间 public void execute() throws Exception { // TODO Auto-generated method stub System.out.println(param+"工作线程编号"+threadkey.toString()); Thread.sleep(TaskExecTime); } public WorkTaskImp(String param){ this.param=param; } public void setTaskThreadKey(Object key){ this.threadkey=key; } public String toString(){ return param+"工作线程编号"+threadkey.toString(); } } package task; /** * 任务类2 * 执行报异常的工作任务 */ public class WorkTaskAImp extends WorkTaskImp{ public WorkTaskAImp(String param) { super(param); // TODO Auto-generated constructor stub } public void execute() throws Exception { // TODO Auto-generated method stub throw new Exception("运行WorkTaskAImp任务时出错"); } } package task; /* * 任务类3 * 执行超时的工作任务 */ public class WorkTaskBImp extends WorkTaskImp{ public WorkTaskBImp(String param) { super(param); // TODO Auto-generated constructor stub } public void execute() throws Exception { // TODO Auto-generated method stub System.out.println("正在"+param); Thread.sleep(50000); //随便定义 } } package event; import task.WorkTask; import thread.WorkThread; /* *任务抽象事件 */ public abstract class AbstractEvent { protected WorkThread workthread; protected Thread nowthread; protected WorkTask nowtask; //事件触发 public synchronized void execute(){}; @Override public boolean equals(Object obj) { // TODO Auto-generated method stub AbstractEvent other=(AbstractEvent)obj; return this.workthread==other.workthread&&this.nowtask==this.nowtask; }; } package event; import task.WorkTask; import thread.ThreadPool; import thread.WorkThread; /* * 任务开始运行事件 */ public class BeginTaskEvent extends AbstractEvent{ public BeginTaskEvent(WorkThread workthread,Thread nowthread,WorkTask task){ this.workthread=workthread; this.nowthread=nowthread; this.nowtask=task; } @Override public void execute() { // TODO Auto-generated method stub ThreadPool pool=ThreadPool.getInstance(); pool.beginTaskRun(this); } } package event; import task.WorkTask; import thread.ThreadPool; import thread.WorkThread; /* * 任务运行结束事件 */ public class EndTaskEvent extends AbstractEvent { public EndTaskEvent(WorkThread workthread,Thread nowthread,WorkTask task){ this.workthread=workthread; this.nowthread=nowthread; this.nowtask=task; } @Override public void execute() { // TODO Auto-generated method stub ThreadPool pool=ThreadPool.getInstance(); pool.endTaskRun(this); } } package event; /* * 任务运行时间类 */ public class TaskRunTime { private long begintime; private long endtime; private BeginTaskEvent event; public TaskRunTime(BeginTaskEvent event){ this.event=event; this.begintime=System.currentTimeMillis(); this.endtime=this.begintime; } public BeginTaskEvent getEvent() { return event; } //检查是否超时 public boolean checkRunTimeOut(long maxtime){ endtime=System.currentTimeMillis(); long cha=endtime-begintime; return cha>=maxtime; } } package event; import task.WorkTask; import thread.ThreadPool; import thread.WorkThread; /* * 任务超时事件 */ public class TaskTimeOutEvent { private AbstractEvent event; public TaskTimeOutEvent(AbstractEvent event){ this.event=event; } @SuppressWarnings("deprecation") public void execute() { // TODO Auto-generated method stub ThreadPool pool=ThreadPool.getInstance(); pool.addWorkThread(); pool.removeWorkThread(event.workthread); Object obj=event.workthread.getThreadKey(); System.out.println("正在停止工作超时线程...线程编号"+obj); event.nowthread.stop(); } }
运行结果
开始初始化线程池...
正在创建工作线程...线程编号0
正在创建工作线程...线程编号1
正在创建工作线程...线程编号2
正在创建工作线程...线程编号3
正在创建工作线程...线程编号4
正在创建工作线程...线程编号5
正在创建工作线程...线程编号6
正在创建工作线程...线程编号7
正在创建工作线程...线程编号8
正在创建工作线程...线程编号9
正在创建任务监测线程...
结束初始化线程池...
正在执行超时任务1...
执行第0个增加用户操作...工作线程编号1
执行第1个增加用户操作...工作线程编号2
执行第2个增加用户操作...工作线程编号3
执行第3个增加用户操作...工作线程编号4
执行第4个增加用户操作...工作线程编号5
执行第5个增加用户操作...工作线程编号6
执行第6个增加用户操作...工作线程编号7
执行第7个增加用户操作...工作线程编号8
执行第8个增加用户操作...工作线程编号9
执行第9个增加用户操作...工作线程编号1
执行第10个增加用户操作...工作线程编号2
执行第11个增加用户操作...工作线程编号3
执行第12个增加用户操作...工作线程编号4
执行第13个增加用户操作...工作线程编号5
执行第14个增加用户操作...工作线程编号6
执行第15个增加用户操作...工作线程编号7
执行第16个增加用户操作...工作线程编号8
执行第17个增加用户操作...工作线程编号9
执行第18个增加用户操作...工作线程编号1
执行第19个增加用户操作...工作线程编号2
正在执行超时任务2...
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
运行WorkTaskAImp任务时出错
执行第0个删除用户操作...工作线程编号4
执行第1个删除用户操作...工作线程编号5
执行第2个删除用户操作...工作线程编号6
执行第3个删除用户操作...工作线程编号7
执行第4个删除用户操作...工作线程编号8
执行第5个删除用户操作...工作线程编号9
执行第6个删除用户操作...工作线程编号1
执行第7个删除用户操作...工作线程编号2
执行第8个删除用户操作...工作线程编号4
执行第9个删除用户操作...工作线程编号5
执行第10个删除用户操作...工作线程编号6
执行第11个删除用户操作...工作线程编号7
执行第12个删除用户操作...工作线程编号8
执行第13个删除用户操作...工作线程编号9
正在关闭任务监测线程...
正在关闭超时监测线程...
正在创建工作线程...线程编号11
正在停止工作超时线程...线程编号0
正在创建工作线程...线程编号12
正在停止工作超时线程...线程编号3
正在关闭工作线程...线程编号1
正在关闭工作线程...线程编号2
正在关闭工作线程...线程编号4
正在关闭工作线程...线程编号5
正在关闭工作线程...线程编号6
正在关闭工作线程...线程编号7
正在关闭工作线程...线程编号8
正在关闭工作线程...线程编号9
正在关闭工作线程...线程编号11
正在关闭工作线程...线程编号12
- src.rar (5.4 KB)
- 下载次数: 390
评论
16 楼
C_J
2009-08-16
因为过段时间可能要用到pool了,所以也提前学习下.
LZ的ThreadPool大致有几个这样的方法:
看了下apache的commons,也大致有如下几个方法:
继续学习中...
LZ的ThreadPool大致有几个这样的方法:
public void init(int count) // 初始化 public MyThread getFreeThread() // 获得 public void close() // 关闭pool
看了下apache的commons,也大致有如下几个方法:
Object borrowObject() // get an instance from pool void returnObject(Object obj) // return an instrance to pool (这点楼主应该是缺少的重要部分) void invalidateObject(Object obj) // invalidates the object when the object is determinded void addObject() // create an object int getNumIdle() // get the number of idle int getNumActive() // return the number of instances currently borrowed from pool void clear() // releasing any associated resources void close() // close the pool and releasing any associated resources (类似LZ的close()了)
继续学习中...
15 楼
jwjava
2009-08-15
请在相应的代码上加上 synchronized;
你的代码在我的电脑上之能够运行到初始化结束;
你的代码在我的电脑上之能够运行到初始化结束;
14 楼
linliangyi2007
2009-08-15
别的都不说了,希望楼主把java代码编辑一下,用Code标签吧。看起来太吃力了阿
13 楼
fjlyxx
2009-08-15
发给你了 请查收.
12 楼
shijianweits163.com
2009-08-15
学习了!!!!!
11 楼
whaosoft
2009-08-14
以前见过一个,跟lz的类似
10 楼
kinghongen
2009-08-14
另外线程类不要继承Thread类,用来实现Runable接口等细节问题。
9 楼
kinghongen
2009-08-14
同意fjlyxx观点
多线程写的比较少,简单说2句感觉:
1.//获取空闲线程
public MyThread getFreeThread(){
while(true){
这个方法好像一直循环,里面连个sleep也没有,严重消耗CPU
2.所有的Get方法好像都保证不了同步安全
多线程写的比较少,简单说2句感觉:
1.//获取空闲线程
public MyThread getFreeThread(){
while(true){
这个方法好像一直循环,里面连个sleep也没有,严重消耗CPU
2.所有的Get方法好像都保证不了同步安全
8 楼
yangke_love
2009-08-14
JDK5.0中有相关的线程管理内容,你可以参考下Think In Java 第四版
7 楼
fjlyxx
2009-08-14
详细说要很久 给我你的EMAIL 我发给你
6 楼
sfjsffjjj
2009-08-14
fjlyxx兄 能说的详细点吧,哪几个点需要改进
5 楼
zhang_jie439
2009-08-14
import java.util.*; public class ThreadPool { private LinkedList<Runnable> taskList = null; private boolean closed = false; public ThreadPool() { this.taskList = new LinkedList<Runnable>(); for (int i = 0; i < 4; i++) { Thread work = new WorkThread(); work.setDaemon(true); work.start(); } } public synchronized void addTask(Runnable task) { if (closed) return; if (null == task) return; this.taskList.add(task); notify(); } private synchronized Runnable getTask() { while (this.taskList.size() == 0) { try { if (closed) return null; wait(); } catch (InterruptedException e) { e.printStackTrace(); } } return this.taskList.removeFirst(); } public void close() { synchronized (this) { this.closed = true; } } private class WorkThread extends Thread { public void run() { while (true) { Runnable task = null; task = getTask(); if (null == task) return; task.run(); } } } }
4 楼
zhang_jie439
2009-08-14
受启发临时编了一个线程池,不知道能用否?见后。
3 楼
fc6029585
2009-08-14
感觉楼主的线程类有很多问题..
比如
/设置线程状态
private void setMyState(String state){
this.state=state;
}
你就设置一个 String ,,怎么就将线程关闭了??
比如
/设置线程状态
private void setMyState(String state){
this.state=state;
}
你就设置一个 String ,,怎么就将线程关闭了??
2 楼
fc6029585
2009-08-14
fjlyxx 写道
还有很大的改进余地,这个线程池只能在学习的代码中用用,实际项目中还是用不了.
请问一下..哪些地方需要改进?
是否直接使用Executor来直接创建线程池的效率高?
1 楼
fjlyxx
2009-08-14
还有很大的改进余地,这个线程池只能在学习的代码中用用,实际项目中还是用不了.
相关推荐
模糊评价的基本代码请多指教
由于时间原因就没有加,如果有需要的朋友可以在评论里留言,有时间我会加上ajax的分页、添加、删除、修改等功能,我也是asp.net mv2的初学者,希望该实例对初学者能有一定的帮助,如有不当之处请多多指教。
新人类请多指教名片制作系统是制作名片用的。1.授权: 本授权合同授于 贵用户下列权利: A.应用程序软件: 贵用户得于单一计算机上安装并使用乙份「软件产品」之 拷贝或同一操作系统之任何先前版本。已安装...
猜词游戏(1.0)(Python, 代码不多,请多指教).py3
这是一个内核对象编程的基本例子,写的不是很好,希望大家多多指教啊!
Devexpress 是一个强大的开发工具包,主要用于创建 Windows ...建议查阅 Devexpress 的官方文档、示例代码和社区论坛,这些资源通常能提供详细的指导和解决方案。同时,进行代码审查和调试也是解决问题的关键步骤。
猜数字(Python 一级,代码不复杂,请多指教!).py3
在C#编程语言中,索引器是一种特殊的方法,它允许类或结构体的实例可以像数组一样通过索...通过分析和学习这个示例,你可以更好地理解索引器的工作方式,并将这种知识应用于自己的项目中,提升代码的灵活性和可读性。
多路抢答器原理图,希望大家多多指教,本来这个是上位机控制的,假如有需要的话,请加我Q:215637873
他反复提及“请大家多多指教”,表达了对资深开发者和同行的谦逊态度,希望从他们那里获取反馈和学习机会,以便不断优化和完善系统功能。 【标签】:“c#”指的是Microsoft公司推出的面向对象的编程语言,它以其易...
标题“我的C++心得 大家指教指教!!!”表明这是一个关于作者个人学习C++过程中积累的经验分享,可能包含了作者在实践中的领悟和技巧。描述中的“一点点心得而已”和“大家一起加油”,暗示了这篇心得可能包含了...
这篇周记来自于河北软件职业技术学院的一位软件开发与设计专业的学生薛志荣,他在java 3班进行毕业实践。周记的主题是“第五周心德”,由赵占昆和张海帆两位指导教师监督,地点在石家庄。这篇周记遵循了学院教务处...
自己用C++编的八皇后代码,大家请指教 自己用C++编的八皇后代码,大家请指教 自己用C++编的八皇后代码,大家请指教
9. **多线程**:考虑到用户体验,系统可能采用多线程技术,让用户在等待操作完成时仍能继续其他操作,如查询车次的同时预订座位。 10. **性能优化**:对于高并发的订票场景,系统可能需要优化查询性能、缓存策略,...
判断反转数(Python 一级,附带解释,请多指教!).py3
最后,为了优化代码和提高效率,可能涉及到C++的高级特性,如模板、STL算法、内存管理和多态等。例如,使用模板可以编写泛化的函数或类,适用于不同类型的动物;而使用STL算法,如`std::sort`,可以方便地对动物进行...
struts,hibernate,spring,初学,写不好,但是实在可以用
判断生肖(Python 一级,用于判断该年的生肖,各位大佬请多指教).py3
在创建虚拟示波器时,我们通常会基于MFC构建用户界面,如对话框或窗口应用程序,这使得代码结构更加清晰,易于维护。 2. **图形绘制基础** 在虚拟示波器中,我们需要在屏幕上绘制波形。VC++中,我们可以使用CDC...