线程池的实现

Java代码
  1. package threadpool;  
  2.   
  3. import ojadb.core.thread.OjadbThreadPool;  
  4. import ojadb.core.thread.task.OjadbTask;  
  5. import ojadb.exception.OjadbException;  
  6.   
  7. public class BasicTest {  
  8.     public static void main(String[] ojadbs) throws OjadbException {  
  9.         OjadbThreadPool pool = new OjadbThreadPool(510);  
  10.         OjadbTask thread = new OjadbTask("test thread");  
  11.         pool.excute(thread);  
  12.         System.exit(0);  
  13.     }  
  14. }  
package threadpool; import ojadb.core.thread.OjadbThreadPool; import ojadb.core.thread.task.OjadbTask; import ojadb.exception.OjadbException; public class BasicTest { public static void main(String[] ojadbs) throws OjadbException { OjadbThreadPool pool = new OjadbThreadPool(5, 10); OjadbTask thread = new OjadbTask("test thread"); pool.excute(thread); System.exit(0); } }

 

线程池:

Java代码
  1. package ojadb.core.thread;  
  2.   
  3. import java.util.concurrent.BlockingQueue;  
  4. import java.util.concurrent.LinkedBlockingQueue;  
  5. import ojadb.core.thread.task.OjadbTask;  
  6. import ojadb.core.thread.thread.OjadbThread;  
  7. import ojadb.exception.OjadbException;  
  8.   
  9. public class OjadbThreadPool {  
  10.     private int minimum;  
  11.     private int maximum;  
  12.     private LinkedBlockingQueue<OjadbThread> ojadbThreads;  
  13.     private BlockingQueue<OjadbTask> ojadbTasks;  
  14.   
  15.     public OjadbThreadPool(int min, int max) throws OjadbException {  
  16.         if (0 < min && min < max) {  
  17.             minimum = min;  
  18.             maximum = max;  
  19.             ojadbThreads = new LinkedBlockingQueue<OjadbThread>();  
  20.             ojadbTasks = new LinkedBlockingQueue<OjadbTask>();  
  21.             for (int i = 0; i < minimum; i++) {  
  22.                 OjadbThread worker = new OjadbThread(this"worker" + i);  
  23.                 worker.start();  
  24.             }  
  25.         } else {  
  26.             throw new OjadbException("无法建立线程池: 最小值必须大于零,小于最大值");  
  27.         }  
  28.     }  
  29.   
  30.     public void addWorker(OjadbThread ojadbThreadWorker) {  
  31.         ojadbThreads.offer(ojadbThreadWorker);  
  32.     }  
  33.   
  34.     public void excute(OjadbTask thread) {  
  35.         // 生产任务  
  36.         ojadbTasks.offer(thread);  
  37.   
  38.         OjadbThread worker = ojadbThreads.remove();  
  39.         if (worker != null) {  
  40.             worker.work();  
  41.         } else if (ojadbThreads.size() < maximum) {  
  42.             OjadbThread newWorker = new OjadbThread(this"worker" + ojadbThreads.size());  
  43.             newWorker.start();  
  44.         } else {  
  45.   
  46.         }  
  47.         releaseThreads();  
  48.     }  
  49.   
  50.     private void releaseThreads() {  
  51.         while (ojadbThreads.size() > minimum) {  
  52.             OjadbThread worker = ojadbThreads.remove();  
  53.             System.out.println(worker + "is killed");  
  54.             worker.kill();  
  55.         }  
  56.     }  
  57.   
  58.     public OjadbTask getTask() {  
  59.         if (ojadbTasks.size() == 0)  
  60.             return null;  
  61.         // 消费任务  
  62.         return ojadbTasks.remove();  
  63.     }  
  64. }  
package ojadb.core.thread; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import ojadb.core.thread.task.OjadbTask; import ojadb.core.thread.thread.OjadbThread; import ojadb.exception.OjadbException; public class OjadbThreadPool { private int minimum; private int maximum; private LinkedBlockingQueue<OjadbThread> ojadbThreads; private BlockingQueue<OjadbTask> ojadbTasks; public OjadbThreadPool(int min, int max) throws OjadbException { if (0 < min && min < max) { minimum = min; maximum = max; ojadbThreads = new LinkedBlockingQueue<OjadbThread>(); ojadbTasks = new LinkedBlockingQueue<OjadbTask>(); for (int i = 0; i < minimum; i++) { OjadbThread worker = new OjadbThread(this, "worker" + i); worker.start(); } } else { throw new OjadbException("无法建立线程池: 最小值必须大于零,小于最大值"); } } public void addWorker(OjadbThread ojadbThreadWorker) { ojadbThreads.offer(ojadbThreadWorker); } public void excute(OjadbTask thread) { // 生产任务 ojadbTasks.offer(thread); OjadbThread worker = ojadbThreads.remove(); if (worker != null) { worker.work(); } else if (ojadbThreads.size() < maximum) { OjadbThread newWorker = new OjadbThread(this, "worker" + ojadbThreads.size()); newWorker.start(); } else { } releaseThreads(); } private void releaseThreads() { while (ojadbThreads.size() > minimum) { OjadbThread worker = ojadbThreads.remove(); System.out.println(worker + "is killed"); worker.kill(); } } public OjadbTask getTask() { if (ojadbTasks.size() == 0) return null; // 消费任务 return ojadbTasks.remove(); } }

 

内部线程:

Java代码
  1. package ojadb.core.thread.thread;  
  2.   
  3. import java.util.concurrent.locks.Condition;  
  4. import java.util.concurrent.locks.ReentrantLock;  
  5.   
  6. import ojadb.core.thread.OjadbThreadPool;  
  7. import ojadb.core.thread.task.OjadbTask;  
  8.   
  9. public class OjadbThread extends Thread {  
  10.     private boolean isActived;  
  11.     private ReentrantLock lock = new ReentrantLock();  
  12.     private Condition condition = lock.newCondition();  
  13.     private OjadbThreadPool pool;  
  14.   
  15.     public OjadbThread(OjadbThreadPool pool, String threadName) {  
  16.         super(threadName);  
  17.         this.pool = pool;  
  18.         isActived = true;  
  19.     }  
  20.   
  21.     @Override  
  22.     public synchronized void start() {  
  23.         super.start();  
  24.     }  
  25.   
  26.     @Override  
  27.     public void run() {  
  28.         try {  
  29.             lock.lock();  
  30.   
  31.             while (isActived) {  
  32.                 OjadbTask task = pool.getTask();  
  33.                 if (task != null) {  
  34.                     String result = (String) task.excute();  
  35.   
  36.                     if (result.length() > 0) {  
  37.                         pool.addWorker(this);  
  38.                         // 懒工人策略 -- 没人招呼工作,绝不睡醒  
  39.                         condition.await();  
  40.                     }  
  41.                 } else {  
  42.                     pool.addWorker(this);  
  43.                     condition.await();  
  44.                 }  
  45.             }  
  46.         } catch (InterruptedException e) {  
  47.             e.printStackTrace();  
  48.         } finally {  
  49.             lock.unlock();  
  50.         }  
  51.     }  
  52.   
  53.     public void work() {  
  54.         try {  
  55.             lock.lock();  
  56.             condition.signal();  
  57.         } finally {  
  58.             lock.unlock();  
  59.         }  
  60.     }  
  61.   
  62.     public void kill() {  
  63.         isActived = false;  
  64.         work();  
  65.     }  
  66.   
  67.     @Override  
  68.     public String toString() {  
  69.         return getName();  
  70.     }  
  71. }  
package ojadb.core.thread.thread; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.ReentrantLock; import ojadb.core.thread.OjadbThreadPool; import ojadb.core.thread.task.OjadbTask; public class OjadbThread extends Thread { private boolean isActived; private ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); private OjadbThreadPool pool; public OjadbThread(OjadbThreadPool pool, String threadName) { super(threadName); this.pool = pool; isActived = true; } @Override public synchronized void start() { super.start(); } @Override public void run() { try { lock.lock(); while (isActived) { OjadbTask task = pool.getTask(); if (task != null) { String result = (String) task.excute(); if (result.length() > 0) { pool.addWorker(this); // 懒工人策略 -- 没人招呼工作,绝不睡醒 condition.await(); } } else { pool.addWorker(this); condition.await(); } } } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void work() { try { lock.lock(); condition.signal(); } finally { lock.unlock(); } } public void kill() { isActived = false; work(); } @Override public String toString() { return getName(); } }

 

用户线程:

Java代码
  1. package ojadb.core.thread.task;  
  2.   
  3. public class OjadbTask {  
  4.     private String threadName;  
  5.   
  6.     public OjadbTask(String threadName) {  
  7.         this.threadName = threadName;  
  8.     }  
  9.   
  10.     public Object excute() {  
  11.         System.out.println("excuting " + threadName);  
  12.         return "success";  
  13.     }  
  14.   
  15.     public String getName() {  
  16.         return threadName;  
  17.     }  
  18.   
  19.     public String toString() {  
  20.         return threadName;  
  21.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值