初次学习多线程——自己写的一个线程池

 1 package com.lovo.threadpool;
 2 
 3 public class ThreadOfPool extends Thread{
 4     private Runnable task = null;
 5     private ThreadPool threadPool;
 6     private boolean stop = false;//线程状态
 7     public ThreadOfPool() {
 8     }
 9     public ThreadOfPool(ThreadPool threadPool) {
10         this.threadPool = threadPool;
11     }
12     /**
13      * 给线程分配指定的任务
14      * @param task
15      */
16     public synchronized void setTask(Runnable task) {
17         this.task = task;
18         notify();
19     }
20     /**
21      * 线程执行
22      */
23     private synchronized void executeTask() {
24         while (!stop) {
25             while (!stop && task == null) {
26                 try {
27                     wait();
28                 } catch (InterruptedException e) {
29                     stop = true;
30                 }
31             }
32             if (task != null) {
33                 task.run();
34                 task = null;
35                 threadPool.free(this);
36             }
37         }
38     }
39     @Override
40     public void run() {
41         executeTask();
42     }
43     public Runnable getTask() {
44         return task;
45     }
46     public void setStop(boolean stop) {
47         this.stop = stop;
48     }
49     
50 }
 1 package com.lovo.threadpool;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 public class ThreadPool {
 7     private List<Thread> freeThreads = new ArrayList<Thread>();//空闲线程(可用)
 8     private List<Thread> usingThreads = new ArrayList<Thread>();//正在被使用的线程(不可用)
 9     private int POOL_SIZE = 5;
10     public ThreadPool(){
11         this(POOL_SIZE);
12     }
13     public ThreadPool(int num){
14         POOL_SIZE = num;
15         for (int i = 0; i < POOL_SIZE; i++) {
16             ThreadOfPool tempThread = new ThreadOfPool(this);
17             tempThread.start();
18             freeThreads.add(tempThread);
19         }
20     }
21     /**
22      * 分配一个线程
23      * @param t
24      */
25     public synchronized void execute(Runnable t) {
26         while (freeThreads.isEmpty()) {
27 //            System.out.println("线程池繁忙,请等待!");
28             try {
29                 wait();
30             } catch (InterruptedException e) {
31                 e.printStackTrace();
32             }
33         }
34         ThreadOfPool tempthread= (ThreadOfPool) freeThreads.remove(freeThreads.size() - 1);
35         usingThreads.add(tempthread);
36         tempthread.setTask(t);
37     }
38     /**
39      * 分配的线程用完后的回收处理
40      * @param threadOfPool
41      */
42     public synchronized void free(ThreadOfPool threadOfPool) {
43         usingThreads.remove(threadOfPool);
44         freeThreads.add(threadOfPool);
45         notify();
46     }
47     /**
48      * 关闭线程池
49      */
50     public void close() {
51         while (freeThreads.size() < POOL_SIZE) {}
52         for (Thread thread : freeThreads) {
53             thread.interrupt();
54         }
55     }
56 }

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。