21
21
import java .util .concurrent .*;
22
22
import java .util .concurrent .atomic .AtomicReference ;
23
23
24
- import rx .Scheduler .Worker ;
25
- import rx .functions .Action0 ;
26
- import rx .internal .schedulers .SchedulerLifecycle ;
24
+ import rx .internal .schedulers .*;
27
25
import rx .internal .util .unsafe .*;
28
- import rx .schedulers .Schedulers ;
29
26
30
27
public abstract class ObjectPool <T > implements SchedulerLifecycle {
31
28
Queue <T > pool ;
32
29
final int minSize ;
33
30
final int maxSize ;
34
31
private final long validationInterval ;
35
32
36
- private final AtomicReference <Worker > schedulerWorker ;
33
+ private final AtomicReference <Future <?>> periodicTask ;
37
34
38
35
public ObjectPool () {
39
36
this (0 , 0 , 67 );
@@ -55,7 +52,7 @@ private ObjectPool(final int min, final int max, final long validationInterval)
55
52
this .minSize = min ;
56
53
this .maxSize = max ;
57
54
this .validationInterval = validationInterval ;
58
- this .schedulerWorker = new AtomicReference <Worker >();
55
+ this .periodicTask = new AtomicReference <Future <?> >();
59
56
// initialize pool
60
57
initialize (min );
61
58
@@ -96,38 +93,51 @@ public void returnObject(T object) {
96
93
*/
97
94
@ Override
98
95
public void shutdown () {
99
- Worker w = schedulerWorker .getAndSet (null );
100
- if (w != null ) {
101
- w . unsubscribe ( );
96
+ Future <?> f = periodicTask .getAndSet (null );
97
+ if (f != null ) {
98
+ f . cancel ( false );
102
99
}
103
100
}
104
101
105
102
@ Override
106
103
public void start () {
107
- Worker w = Schedulers .computation ().createWorker ();
108
- if (schedulerWorker .compareAndSet (null , w )) {
109
- w .schedulePeriodically (new Action0 () {
110
-
111
- @ Override
112
- public void call () {
113
- int size = pool .size ();
114
- if (size < minSize ) {
115
- int sizeToBeAdded = maxSize - size ;
116
- for (int i = 0 ; i < sizeToBeAdded ; i ++) {
117
- pool .add (createObject ());
118
- }
119
- } else if (size > maxSize ) {
120
- int sizeToBeRemoved = size - maxSize ;
121
- for (int i = 0 ; i < sizeToBeRemoved ; i ++) {
122
- // pool.pollLast();
123
- pool .poll ();
104
+ for (;;) {
105
+ if (periodicTask .get () != null ) {
106
+ return ;
107
+ }
108
+ ScheduledExecutorService w = GenericScheduledExecutorService .getInstance ();
109
+
110
+ Future <?> f ;
111
+ try {
112
+ f = w .scheduleAtFixedRate (new Runnable () {
113
+
114
+ @ Override
115
+ public void run () {
116
+ int size = pool .size ();
117
+ if (size < minSize ) {
118
+ int sizeToBeAdded = maxSize - size ;
119
+ for (int i = 0 ; i < sizeToBeAdded ; i ++) {
120
+ pool .add (createObject ());
121
+ }
122
+ } else if (size > maxSize ) {
123
+ int sizeToBeRemoved = size - maxSize ;
124
+ for (int i = 0 ; i < sizeToBeRemoved ; i ++) {
125
+ // pool.pollLast();
126
+ pool .poll ();
127
+ }
124
128
}
125
129
}
126
- }
127
-
128
- }, validationInterval , validationInterval , TimeUnit .SECONDS );
129
- } else {
130
- w .unsubscribe ();
130
+
131
+ }, validationInterval , validationInterval , TimeUnit .SECONDS );
132
+ } catch (RejectedExecutionException ex ) {
133
+ RxJavaPluginUtils .handleException (ex );
134
+ break ;
135
+ }
136
+ if (!periodicTask .compareAndSet (null , f )) {
137
+ f .cancel (false );
138
+ } else {
139
+ break ;
140
+ }
131
141
}
132
142
}
133
143
0 commit comments