以下先总结具体设计思路:
1、创建一个线程池——ThreadPool 类 ,由于Java面向对象的特点 你要清楚该类定义来是干什么的 在实例化该类的对象一定会调用其构造方法 那么构造方法就有着要实现的功能 —— 就比如线程池对象实例化后就是一个装着可供处理某种任务的线程集合 于是线程池这个类本身不会去继承Thread 是特意处理某种类型任务的自定义线程类去继承
因此在实例化线程池类的对象时 在该类的调用方法里实例化好这个特意处理某种类型任务的自定义线程类对象就是一种线程池
public class ThreadPool {
int ThreadPoolsize=0;//自定义的线程池大小
public ThreadPool()
{
ThreadPoolsize=10;
for (int i = 0; i < ThreadPoolsize; i++) {
new TaskConsumeThread("任务消费者线程 " + i).start();
}
}
}
TaskConsumeThread类就是特意处理某种类型任务的自定义线程类
后面的.start() 就是整个线程池待命——启动
2、线程池的具体模型建立好了之后 在该类里定义一个LinkedList 的集合 该集合加以泛型 主要是用于对Runnable接口写法创建Thread类有关 也可以改成Thread类此类就是匿名类写法
实例化LinkedList 这个集合对象 主要是来装测试类里Runnable接口写法创建的Thread类 怎么说呢 就是你真正创建线程池要来解决的任务线程 这里就是线程类对线程类了 容易混淆
有多少任务线程就装多少 且每装一次都会notifyAll 意为来一个任务线程类就唤醒线程池里随机一个来处理 这样才高效。
TaskConsumeThread类就是特意处理某种类型任务的自定义线程类
此种类里的run方法就是每一次从线程池随机抽取的线程具体要进行的操作具体为——LinkedList中的装的任务线程进行依次去除 处理。
class TaskConsumeThread extends Thread{
public TaskConsumeThread(String name)
{
super(name);
}
Runnable task;
public void run() {
System.out.println("启动:"+this.getName());
while(true)
{
synchronized (link) {
while(link.isEmpty())
{
try {
link.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
task=link.removeLast();
link.notifyAll();
}
System.out.println(this.getName()+"获取到任务,并执行");
task.run();
}
}
}
Runnable task;细节之处先定义好引用 便于后续剔除执行操作task=link.removeLast();link.notifyAll();
task.run();执行的就是测试类里的任务线程要实现的具体功能
线程安全——全程都可以以集合对象为同步对象利用关键字synchronized代码块执行完毕
以下是测试类:
public class Testthread {
public static void main(String[] args) {
ThreadPool pool=new ThreadPool();
for (int i = 0; i < pool.ThreadPoolsize; i++) {
Runnable task=new Runnable() {
public void run()
{
}
};
pool.add(task);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}