线程池

    技术2022-06-24  42

    package multithread; import java.util.LinkedList; public class ThreadPool extends ThreadGroup { private boolean isClosed = false;// 线程池是否关闭 private LinkedList workQueue;// 工作队列 private static int threadPoolId = 1;// 线程池的id public ThreadPool(int poolSize) { super(threadPoolId + "");// 指定ThreadGroup的名称 setDaemon(true);// 设置是否守护线程池 workQueue = new LinkedList();// 创建工作队列 System.out.println("启动工作线程..."); for (int i = 0; i < poolSize; i++) { new WorkThread(i).start();// 创建并启动工作线程 } System.out.println("启动工作线程完成"); } /** * 等待工作线程把所有任务执行完毕 */ public void waitFinish() { synchronized (this) { isClosed = true; notifyAll(); // 唤醒所有还在getTask()方法中等待任务的工作线程 } // activeCount() 返回该线程组中活动线程的估计值。 Thread[] threads = new Thread[activeCount()]; // enumerate()方法继承自ThreadGroup类,根据活动线程的估计值获得线程组中当前所有活动的工作线程 int count = enumerate(threads); for (int i = 0; i < count; i++) { // 等待所有工作线程结束 try { threads[i].join(); // 等待工作线程结束 } catch (InterruptedException ex) { ex.printStackTrace(); } } } /** * 关闭线程池 */ public synchronized void closePool() { if (!isClosed) { // 等待工作线程执行完毕 waitFinish(); isClosed = true; // 清空工作队列 workQueue.clear(); // 中断线程池中的所有的工作线程,此方法继承自ThreadGroup类 interrupt(); } } /** * 向工作队列中加入一个新任务,由工作线程去执行该任务 */ public synchronized void execute(Runnable task) { if (isClosed) { throw new IllegalStateException(); } if (task != null) { // 向队列中加入一个任务 workQueue.add(task); // 唤醒一个正在getTask()方法中待任务的工作线程 notify(); } } /** * 从工作队列中取出一个任务,工作线程会调用此方法 */ private synchronized Runnable getTask(int threadId) throws InterruptedException { while (workQueue.isEmpty()) { if (isClosed) return null; System.out.println("工作线程" + threadId + "等待任务..."); wait(); } System.out.println("工作线程" + threadId + "开始执行任务...当前任务数:" + workQueue.size()); // 返回队列中第一个元素,并从队列中删除 return (Runnable) workQueue.removeFirst(); } /** * 内部类,工作线程,负责从工作队列中取出任务,并执行 */ private class WorkThread extends Thread { private int id; public WorkThread(int id) { // 父类构造方法,将线程加入到当前ThreadPool线程组中 super(ThreadPool.this, id + ""); this.id = id; } @Override public void run() { while (!isInterrupted()) {// 判断线程是否被中断 Runnable task = null; try { task = getTask(id);// 取出任务 } catch (InterruptedException ex) { ex.printStackTrace(); } if (task == null) return; try { taskTimeOperation();// 耗时操作 this.sleep(100); task.run();// 运行任务 } catch (InterruptedException e) { e.printStackTrace(); } } } } // 耗时的操作 private void taskTimeOperation() { int i = 0; String test = ""; while (i < ThreadPoolTest.TAKETIME_NUM) { test += "" + i; i++; } } }

    package multithread; public class ThreadPoolTest { // 线程数 private static final int THREAD_NUM = 5; // 任务数 private static final int TASK_NUM = 15; // 费时的操作的时间度 public static final int TAKETIME_NUM = 5500; public static void main(String[] args) throws InterruptedException { long beginTime = System.currentTimeMillis(); // 创建一个有THREAD_NUM个工作线程的线程池 ThreadPool threadPool = new ThreadPool(THREAD_NUM); // 休眠500毫秒,以便让线程池中的工作线程全部运行 Thread.sleep(500); // 运行任务 for (int i = 0; i <= TASK_NUM; i++) { // 创建TASK_NUM个任务 threadPool.execute(createTask(i)); } threadPool.waitFinish(); // 等待所有任务执行完毕 threadPool.closePool(); // 关闭线程池 long endTime = System.currentTimeMillis(); System.out.print("****当前线程数:" + THREAD_NUM + ",******共用时间:" + (endTime - beginTime)); } private static Runnable createTask(final int taskID) { return new Runnable() { public void run() { System.out.println("Task" + taskID + "开始"); // 模拟任务... System.out.println("Task" + taskID + "结束"); } }; } }

    来自:http://blog.csdn.net/ykdsg/archive/2010/01/29/5270935.aspx


    最新回复(0)