Mercurial Hosting > nabble
comparison src/fschmidt/util/executor/AbstractThreadPool.java @ 68:00520880ad02
add fschmidt source
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Sun, 05 Oct 2025 17:24:15 -0600 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
67:9d0fefce6985 | 68:00520880ad02 |
---|---|
1 package fschmidt.util.executor; | |
2 | |
3 import java.util.List; | |
4 import java.util.Queue; | |
5 import java.util.LinkedList; | |
6 import java.util.concurrent.Executor; | |
7 import java.util.concurrent.TimeUnit; | |
8 import java.util.concurrent.CopyOnWriteArrayList; | |
9 import java.util.concurrent.atomic.AtomicInteger; | |
10 import org.slf4j.Logger; | |
11 import org.slf4j.LoggerFactory; | |
12 | |
13 | |
14 abstract class AbstractThreadPool implements RunnableWrapper { | |
15 private static final Logger logger = LoggerFactory.getLogger(AbstractThreadPool.class); | |
16 | |
17 private final Thread[] threads; | |
18 private boolean isRunning = true; | |
19 private final AtomicInteger activeCount = new AtomicInteger(0); | |
20 private final List<RunnableWrapper> runnableWrappers = new CopyOnWriteArrayList<RunnableWrapper>(); | |
21 | |
22 private final Runnable worker = new Runnable() { | |
23 | |
24 public void run() { | |
25 Runnable command; | |
26 while( (command = getCommand()) != null ) { | |
27 activeCount.incrementAndGet(); | |
28 try { | |
29 command.run(); | |
30 } catch(RuntimeException e) { | |
31 logger.error("",e); | |
32 } catch(Error e) { | |
33 logger.error("",e); | |
34 } finally { | |
35 activeCount.decrementAndGet(); | |
36 } | |
37 } | |
38 } | |
39 | |
40 }; | |
41 | |
42 public AbstractThreadPool(int size) { | |
43 threads = new Thread[size]; | |
44 } | |
45 | |
46 final void start() { | |
47 for( int i=0; i<threads.length; i++ ) { | |
48 Thread thread = new Thread(worker); | |
49 thread.start(); | |
50 threads[i] = thread; | |
51 } | |
52 } | |
53 | |
54 public final void addRunnableWrapper(RunnableWrapper wrapper) { | |
55 runnableWrappers.add(wrapper); | |
56 } | |
57 | |
58 @Override final public Runnable wrap(Runnable command) { | |
59 for( RunnableWrapper wrapper : runnableWrappers ) { | |
60 command = wrapper.wrap(command); | |
61 } | |
62 return command; | |
63 } | |
64 | |
65 boolean isRunning() { | |
66 return isRunning; | |
67 } | |
68 | |
69 abstract Runnable getCommand(); | |
70 | |
71 public final synchronized void shutdown() { | |
72 isRunning = false; | |
73 notifyAll(); | |
74 } | |
75 | |
76 public final boolean isTerminated() { | |
77 for( Thread thread : threads ) { | |
78 if( thread.isAlive() ) | |
79 return false; | |
80 } | |
81 return true; | |
82 } | |
83 | |
84 public final void join() throws InterruptedException { | |
85 shutdown(); | |
86 for( Thread thread : threads ) { | |
87 thread.join(); | |
88 } | |
89 } | |
90 | |
91 public final void join(long timeoutMillis) throws InterruptedException { | |
92 long until = System.currentTimeMillis() + timeoutMillis; | |
93 long now; | |
94 int i = 0; | |
95 while( i < threads.length && (now = System.currentTimeMillis()) < until ) { | |
96 threads[i].join(until-now); | |
97 i++; | |
98 } | |
99 } | |
100 | |
101 public final boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException { | |
102 long timeoutMillis = unit.toMillis(timeout); | |
103 join(timeoutMillis); | |
104 return isTerminated(); | |
105 } | |
106 | |
107 public final int getPoolSize() { | |
108 return threads.length; | |
109 } | |
110 | |
111 public final int getActiveCount() { | |
112 return activeCount.get(); | |
113 } | |
114 | |
115 public abstract int getQueueSize(); | |
116 | |
117 public final Thread[] getThreads() { | |
118 return threads; | |
119 } | |
120 } |