由于最近开始学习java,用到了线程池,按照之前c++的写法写出此java版的线程池

TaskRunnale实现相关任务的接口,具体要实现什么任务在相应的run函数中实现。
package threadpool;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue; class TaskRunnale implements Runnable
{
public void run()
{
System.out.println(this.hashCode() + "Testrunner in Works");
//此方法使本线程睡眠5秒
synchronized (this)
{
try
{
wait(1000);//等待5秒时间
}
catch (InterruptedException ioe)
{
}
}
System.out.println(this.hashCode() + "Testrunner out Works");
}
} class Thread_InPool extends Thread
{
private ThreadPool pool_ = null; // 池中线程需要知道自己所在的池
private Runnable target_ = null; // 线程的任务
private boolean shutDown_ = false;
private boolean idle_ = false;//设置是否让线程处于等待状态 public Thread_InPool(ThreadPool spool)
{ super();
pool_ = spool;
start();
} public void run()
{
// 这个循环不能结束,除非池类要求线程结束
// 每一次循环都会执行一次池类分配给的任务target
while (!shutDown_)
{ idle_ = false;
if (target_ != null)
{
target_.run(); // 运行target中的代码
target_ = null; if(pool_.SwitchThread(this) == 1)
continue; }
else
{
idle_ = true;
synchronized (this)
{
try
{
wait(2000);//等待2秒时间
}
catch (InterruptedException ioe)
{
}
}
} }
//循环这里不能结束,否则线程结束,资源被VM收回,
//就无法起到线程池的作用了
} public synchronized void setTarget(java.lang.Runnable newTarget)
{//设置新的target,并唤醒睡眠中的线程
target_ = newTarget; // 新任务
notifyAll(); // 唤醒睡眠的线程
} public synchronized void shutDown()
{
shutDown_ = true;
notifyAll();
}
} public class ThreadPool { private static ThreadPool instance_ = null;
public static final int LOW_PRIORITY = 0;
public static final int NORMAL_PRIORITY = 1;
public static final int HIGH_PRIORITY = 2; private static int m_Threadcount = 4;
private List<Thread_InPool> m_IdleThread = new ArrayList<Thread_InPool>(); //空闲的线程
private List<Thread_InPool> m_ActiveThread = new ArrayList<Thread_InPool>();//处于任务执行的线程
private Queue<Runnable> m_RunableTarger = new ArrayDeque<Runnable>(); ;//任务队列,此处用Queue,是考虑到可以有任务优先级的扩展 private ThreadPool(int initcount)
{
m_Threadcount = initcount > 0?initcount:4;
for(int i = 0 ;i< m_Threadcount ; i++)
{
m_IdleThread.add(new Thread_InPool(this));
}
} public static ThreadPool Get_Instance() {
if (instance_ == null)
instance_ = new ThreadPool(3);
return instance_;
} public synchronized void DestroyPool()
{
for(int i = 0 ;i< m_IdleThread.size();i++)
{ Thread_InPool dthread = m_IdleThread.get(i);
dthread.shutDown();
}
for(int i = 0 ;i< m_ActiveThread.size();i++)
{ Thread_InPool dthread = m_ActiveThread.get(i);
dthread.shutDown();
} } public synchronized void InsertTarget(java.lang.Runnable newTarget) //插入新的任务
{
if(newTarget == null) return; if(!m_IdleThread.isEmpty())
{
Thread_InPool i_thread = null;
i_thread = m_IdleThread.get(m_IdleThread.size()-1);
m_IdleThread.remove(i_thread);
i_thread.setTarget(newTarget);
m_ActiveThread.add(i_thread);
}
else
{
m_RunableTarger.add(newTarget);
}
} public synchronized int SwitchThread(Thread_InPool switchThread) //任务结束后,如果任务队列不为空,则继续执行新的任务,否则入空队列
{
int rvalue = 0;
if(!m_RunableTarger.isEmpty())
{
java.lang.Runnable o_Target = m_RunableTarger.poll();
if(o_Target != null)
{
switchThread.setTarget(o_Target);
rvalue = 1;
}
}
else
{
m_IdleThread.add(switchThread);
m_ActiveThread.remove(switchThread);
}
return rvalue;
}
}

 如果代码存在什么问题,欢迎指正,相关学习 

Java实现的 线程池的更多相关文章

  1. Java 四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端执行一个异步任务你还只是如下new T ...

  2. Java四种线程池

    Java四种线程池newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor 时间:20 ...

  3. java笔记--使用线程池优化多线程编程

    使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...

  4. Java多线程和线程池

    转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...

  5. Java多线程之线程池详解

    前言 在认识线程池之前,我们需要使用线程就去创建一个线程,但是我们会发现有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因 ...

  6. Java四种线程池的学习与总结

    在Java开发中,有时遇到多线程的开发时,直接使用Thread操作,对程序的性能和维护上都是一个问题,使用Java提供的线程池来操作可以很好的解决问题. 一.new Thread的弊端 执行一个异步任 ...

  7. java多线程、线程池及Spring配置线程池详解

    1.java中为什么要使用多线程使用多线程,可以把一些大任务分解成多个小任务来执行,多个小任务之间互不影像,同时进行,这样,充分利用了cpu资源.2.java中简单的实现多线程的方式 继承Thread ...

  8. Java高并发 -- 线程池

    Java高并发 -- 线程池 主要是学习慕课网实战视频<Java并发编程入门与高并发面试>的笔记 在使用线程池后,创建线程变成了从线程池里获得空闲线程,关闭线程变成了将线程归坏给线程池. ...

  9. (转载)new Thread的弊端及Java四种线程池的使用

    介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用.本文是基础篇,后面会分享下线程池一些高级功能. 1.new Thread的弊端 执行一个异步任务你还只是如下new ...

随机推荐

  1. 修改mysql错误提示语言的方法

    百度真的太恶心太无能了. 装了个mysql5,结果发现错误提示语言是法语. 然后我就想改成把错误提示语改成英语. 然后我使用各种关键字和方法百度了一个上午,居然全TM是告诉我怎么处理mysql中文乱码 ...

  2. 常用js代码整理、收集

    个人整理了一下个人常用到的一些js代码,以方便学习以及日后使用,或许有一些是个人之前从网上摘下来的,但是不记得是具体从哪里来的了,如果你看到有一段代码跟你的文章很相似甚至一样,请不要气愤,请告诉我,我 ...

  3. NAS4Free 安装配置(三)基本配置

    基本配置 在浏览器中输入地址,进入管理界面(我的是http://192.168.0.10) 登录界面 初始用户名:admin,初始密码:nas4free 首页 进入基本配置 这里可以选择语言,有中文, ...

  4. Pyhon之常用操作符 - 零基础入门学习Python006

    Pyhon之常用操作符 让编程改变世界 Change the world by program 今天我们来谈谈Python之常用操作符,在此之前的一些例子中,大家已经看到Python可以完成简单的算术 ...

  5. php读取文件的各种方法

    博客根据http://www.ibm.com/developerworks/cn/opensource/os-php-readfiles个人总结 获取文件全部内容 以下归类是按平时我们通常的使用方法总 ...

  6. HornetQ

    https://github.com/flsusp/http-queue https://github.com/sfr-network-service-platforms/hq-console htt ...

  7. find之exec和args

    本来以为以前的差不多够用了.呵呵,看到很多高手用高技巧,心痒痒的觉得我自己还可以提升啊..哈哈哈. 这个实践起来之后,,SED,AWK也得深化一下,,,SHELL和PYTHON,作运维的两样都不能废. ...

  8. 必须得是一万小时的 刻意训练(deliberate practice)

    成功素质1:一万小时与格物致知 “格物致知14”的概念,我是从张银奎11老师那里了解到的.它的意思是“推究事物的原理,从而获得知识”,跟我在<透过现象看本质 - 写在观看WWDC 2016 Ke ...

  9. C语言中的声明解析规则——数组,指针与函数

    摘要:C语言的申明存在的最大问题是:你无法以一种人们所习惯的自然方式和从左向右阅读一个声明,在引入voliatile和const关键字以后,情况更加糟糕了.由于这些关键字只能出现在声明中,是的声明形式 ...

  10. Linux2.6内核 -- 结构的初始化

          Linux 内核中用到了大量的结构体,在编码规范中也给出了结构体初始化的规则,这篇文章中有对其的解释:http://blog.csdn.net/dlutbrucezhang/article ...