concurrent-ruby 0.8.0.pre2-java → 0.9.0-java

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +114 -3
  3. data/README.md +111 -55
  4. data/lib/concurrent.rb +90 -14
  5. data/lib/concurrent/async.rb +143 -51
  6. data/lib/concurrent/atom.rb +131 -0
  7. data/lib/concurrent/atomic/atomic_boolean.rb +57 -107
  8. data/lib/concurrent/atomic/atomic_fixnum.rb +73 -101
  9. data/lib/concurrent/atomic/atomic_reference.rb +49 -0
  10. data/lib/concurrent/atomic/condition.rb +23 -12
  11. data/lib/concurrent/atomic/count_down_latch.rb +23 -21
  12. data/lib/concurrent/atomic/cyclic_barrier.rb +47 -47
  13. data/lib/concurrent/atomic/event.rb +33 -42
  14. data/lib/concurrent/atomic/read_write_lock.rb +252 -0
  15. data/lib/concurrent/atomic/semaphore.rb +64 -89
  16. data/lib/concurrent/atomic/thread_local_var.rb +130 -58
  17. data/lib/concurrent/atomic/thread_local_var/weak_key_map.rb +236 -0
  18. data/lib/concurrent/atomic_reference/direct_update.rb +34 -3
  19. data/lib/concurrent/atomic_reference/jruby.rb +6 -3
  20. data/lib/concurrent/atomic_reference/mutex_atomic.rb +17 -39
  21. data/lib/concurrent/atomic_reference/numeric_cas_wrapper.rb +3 -0
  22. data/lib/concurrent/atomic_reference/rbx.rb +4 -1
  23. data/lib/concurrent/atomic_reference/ruby.rb +6 -3
  24. data/lib/concurrent/atomics.rb +74 -4
  25. data/lib/concurrent/collection/copy_on_notify_observer_set.rb +115 -0
  26. data/lib/concurrent/collection/copy_on_write_observer_set.rb +119 -0
  27. data/lib/concurrent/collection/priority_queue.rb +300 -245
  28. data/lib/concurrent/concern/deprecation.rb +34 -0
  29. data/lib/concurrent/concern/dereferenceable.rb +88 -0
  30. data/lib/concurrent/concern/logging.rb +27 -0
  31. data/lib/concurrent/concern/obligation.rb +228 -0
  32. data/lib/concurrent/concern/observable.rb +85 -0
  33. data/lib/concurrent/configuration.rb +234 -109
  34. data/lib/concurrent/dataflow.rb +2 -3
  35. data/lib/concurrent/delay.rb +141 -50
  36. data/lib/concurrent/edge.rb +30 -0
  37. data/lib/concurrent/errors.rb +19 -7
  38. data/lib/concurrent/exchanger.rb +25 -1
  39. data/lib/concurrent/executor/cached_thread_pool.rb +51 -33
  40. data/lib/concurrent/executor/executor.rb +46 -299
  41. data/lib/concurrent/executor/executor_service.rb +521 -0
  42. data/lib/concurrent/executor/fixed_thread_pool.rb +196 -23
  43. data/lib/concurrent/executor/immediate_executor.rb +9 -9
  44. data/lib/concurrent/executor/indirect_immediate_executor.rb +4 -3
  45. data/lib/concurrent/executor/java_single_thread_executor.rb +17 -16
  46. data/lib/concurrent/executor/java_thread_pool_executor.rb +55 -102
  47. data/lib/concurrent/executor/ruby_single_thread_executor.rb +14 -16
  48. data/lib/concurrent/executor/ruby_thread_pool_executor.rb +250 -166
  49. data/lib/concurrent/executor/safe_task_executor.rb +5 -4
  50. data/lib/concurrent/executor/serialized_execution.rb +22 -18
  51. data/lib/concurrent/executor/{per_thread_executor.rb → simple_executor_service.rb} +29 -20
  52. data/lib/concurrent/executor/single_thread_executor.rb +32 -21
  53. data/lib/concurrent/executor/thread_pool_executor.rb +73 -60
  54. data/lib/concurrent/executor/timer_set.rb +96 -84
  55. data/lib/concurrent/executors.rb +1 -1
  56. data/lib/concurrent/future.rb +71 -38
  57. data/lib/concurrent/immutable_struct.rb +89 -0
  58. data/lib/concurrent/ivar.rb +152 -60
  59. data/lib/concurrent/lazy_register.rb +40 -20
  60. data/lib/concurrent/maybe.rb +226 -0
  61. data/lib/concurrent/mutable_struct.rb +227 -0
  62. data/lib/concurrent/mvar.rb +44 -43
  63. data/lib/concurrent/promise.rb +229 -136
  64. data/lib/concurrent/scheduled_task.rb +341 -43
  65. data/lib/concurrent/settable_struct.rb +127 -0
  66. data/lib/concurrent/synchronization.rb +17 -0
  67. data/lib/concurrent/synchronization/abstract_object.rb +163 -0
  68. data/lib/concurrent/synchronization/abstract_struct.rb +158 -0
  69. data/lib/concurrent/synchronization/condition.rb +53 -0
  70. data/lib/concurrent/synchronization/java_object.rb +34 -0
  71. data/lib/concurrent/synchronization/lock.rb +32 -0
  72. data/lib/concurrent/synchronization/monitor_object.rb +26 -0
  73. data/lib/concurrent/synchronization/mutex_object.rb +43 -0
  74. data/lib/concurrent/synchronization/object.rb +78 -0
  75. data/lib/concurrent/synchronization/rbx_object.rb +75 -0
  76. data/lib/concurrent/timer_task.rb +92 -103
  77. data/lib/concurrent/tvar.rb +42 -38
  78. data/lib/concurrent/utilities.rb +3 -1
  79. data/lib/concurrent/utility/at_exit.rb +97 -0
  80. data/lib/concurrent/utility/engine.rb +44 -0
  81. data/lib/concurrent/utility/monotonic_time.rb +59 -0
  82. data/lib/concurrent/utility/native_extension_loader.rb +56 -0
  83. data/lib/concurrent/utility/processor_counter.rb +156 -0
  84. data/lib/concurrent/utility/timeout.rb +18 -14
  85. data/lib/concurrent/utility/timer.rb +11 -6
  86. data/lib/concurrent/version.rb +2 -1
  87. data/lib/concurrent_ruby.rb +1 -0
  88. data/lib/concurrent_ruby_ext.jar +0 -0
  89. metadata +46 -66
  90. data/lib/concurrent/actor.rb +0 -103
  91. data/lib/concurrent/actor/behaviour.rb +0 -70
  92. data/lib/concurrent/actor/behaviour/abstract.rb +0 -48
  93. data/lib/concurrent/actor/behaviour/awaits.rb +0 -21
  94. data/lib/concurrent/actor/behaviour/buffer.rb +0 -54
  95. data/lib/concurrent/actor/behaviour/errors_on_unknown_message.rb +0 -12
  96. data/lib/concurrent/actor/behaviour/executes_context.rb +0 -18
  97. data/lib/concurrent/actor/behaviour/linking.rb +0 -45
  98. data/lib/concurrent/actor/behaviour/pausing.rb +0 -77
  99. data/lib/concurrent/actor/behaviour/removes_child.rb +0 -16
  100. data/lib/concurrent/actor/behaviour/sets_results.rb +0 -36
  101. data/lib/concurrent/actor/behaviour/supervised.rb +0 -59
  102. data/lib/concurrent/actor/behaviour/supervising.rb +0 -34
  103. data/lib/concurrent/actor/behaviour/terminates_children.rb +0 -13
  104. data/lib/concurrent/actor/behaviour/termination.rb +0 -54
  105. data/lib/concurrent/actor/context.rb +0 -154
  106. data/lib/concurrent/actor/core.rb +0 -217
  107. data/lib/concurrent/actor/default_dead_letter_handler.rb +0 -9
  108. data/lib/concurrent/actor/envelope.rb +0 -41
  109. data/lib/concurrent/actor/errors.rb +0 -27
  110. data/lib/concurrent/actor/internal_delegations.rb +0 -49
  111. data/lib/concurrent/actor/public_delegations.rb +0 -40
  112. data/lib/concurrent/actor/reference.rb +0 -81
  113. data/lib/concurrent/actor/root.rb +0 -37
  114. data/lib/concurrent/actor/type_check.rb +0 -48
  115. data/lib/concurrent/actor/utils.rb +0 -10
  116. data/lib/concurrent/actor/utils/ad_hoc.rb +0 -21
  117. data/lib/concurrent/actor/utils/balancer.rb +0 -42
  118. data/lib/concurrent/actor/utils/broadcast.rb +0 -52
  119. data/lib/concurrent/actor/utils/pool.rb +0 -59
  120. data/lib/concurrent/actress.rb +0 -3
  121. data/lib/concurrent/agent.rb +0 -209
  122. data/lib/concurrent/atomic.rb +0 -92
  123. data/lib/concurrent/atomic/copy_on_notify_observer_set.rb +0 -118
  124. data/lib/concurrent/atomic/copy_on_write_observer_set.rb +0 -117
  125. data/lib/concurrent/atomic/synchronization.rb +0 -51
  126. data/lib/concurrent/channel/buffered_channel.rb +0 -85
  127. data/lib/concurrent/channel/channel.rb +0 -41
  128. data/lib/concurrent/channel/unbuffered_channel.rb +0 -35
  129. data/lib/concurrent/channel/waitable_list.rb +0 -40
  130. data/lib/concurrent/channels.rb +0 -5
  131. data/lib/concurrent/collection/blocking_ring_buffer.rb +0 -71
  132. data/lib/concurrent/collection/ring_buffer.rb +0 -59
  133. data/lib/concurrent/collections.rb +0 -3
  134. data/lib/concurrent/dereferenceable.rb +0 -108
  135. data/lib/concurrent/executor/java_cached_thread_pool.rb +0 -32
  136. data/lib/concurrent/executor/java_fixed_thread_pool.rb +0 -31
  137. data/lib/concurrent/executor/ruby_cached_thread_pool.rb +0 -29
  138. data/lib/concurrent/executor/ruby_fixed_thread_pool.rb +0 -32
  139. data/lib/concurrent/executor/ruby_thread_pool_worker.rb +0 -73
  140. data/lib/concurrent/logging.rb +0 -20
  141. data/lib/concurrent/obligation.rb +0 -171
  142. data/lib/concurrent/observable.rb +0 -73
  143. data/lib/concurrent/options_parser.rb +0 -48
  144. data/lib/concurrent/utility/processor_count.rb +0 -152
  145. data/lib/extension_helper.rb +0 -37
@@ -1,33 +1,206 @@
1
- require 'concurrent/executor/ruby_fixed_thread_pool'
1
+ require 'concurrent/utility/engine'
2
+ require 'concurrent/executor/thread_pool_executor'
2
3
 
3
4
  module Concurrent
4
5
 
5
- if RUBY_PLATFORM == 'java'
6
- require 'concurrent/executor/java_fixed_thread_pool'
7
- # @!macro [attach] fixed_thread_pool
8
- #
9
- # A thread pool with a set number of threads. The number of threads in the pool
10
- # is set on construction and remains constant. When all threads are busy new
11
- # tasks `#post` to the thread pool are enqueued until a thread becomes available.
12
- # Should a thread crash for any reason the thread will immediately be removed
13
- # from the pool and replaced.
6
+ # @!macro [new] thread_pool_executor_constant_default_max_pool_size
7
+ # Default maximum number of threads that will be created in the pool.
8
+
9
+ # @!macro [new] thread_pool_executor_constant_default_min_pool_size
10
+ # Default minimum number of threads that will be retained in the pool.
11
+
12
+ # @!macro [new] thread_pool_executor_constant_default_max_queue_size
13
+ # Default maximum number of tasks that may be added to the task queue.
14
+
15
+ # @!macro [new] thread_pool_executor_constant_default_thread_timeout
16
+ # Default maximum number of seconds a thread in the pool may remain idle
17
+ # before being reclaimed.
18
+
19
+ # @!macro [new] thread_pool_executor_attr_reader_max_length
20
+ # The maximum number of threads that may be created in the pool.
21
+ # @return [Integer] The maximum number of threads that may be created in the pool.
22
+
23
+ # @!macro [new] thread_pool_executor_attr_reader_min_length
24
+ # The minimum number of threads that may be retained in the pool.
25
+ # @return [Integer] The minimum number of threads that may be retained in the pool.
26
+
27
+ # @!macro [new] thread_pool_executor_attr_reader_largest_length
28
+ # The largest number of threads that have been created in the pool since construction.
29
+ # @return [Integer] The largest number of threads that have been created in the pool since construction.
30
+
31
+ # @!macro [new] thread_pool_executor_attr_reader_scheduled_task_count
32
+ # The number of tasks that have been scheduled for execution on the pool since construction.
33
+ # @return [Integer] The number of tasks that have been scheduled for execution on the pool since construction.
34
+
35
+ # @!macro [new] thread_pool_executor_attr_reader_completed_task_count
36
+ # The number of tasks that have been completed by the pool since construction.
37
+ # @return [Integer] The number of tasks that have been completed by the pool since construction.
38
+
39
+ # @!macro [new] thread_pool_executor_attr_reader_idletime
40
+ # The number of seconds that a thread may be idle before being reclaimed.
41
+ # @return [Integer] The number of seconds that a thread may be idle before being reclaimed.
42
+
43
+ # @!macro [new] thread_pool_executor_attr_reader_max_queue
44
+ # The maximum number of tasks that may be waiting in the work queue at any one time.
45
+ # When the queue size reaches `max_queue` subsequent tasks will be rejected in
46
+ # accordance with the configured `fallback_policy`.
47
+ #
48
+ # @return [Integer] The maximum number of tasks that may be waiting in the work queue at any one time.
49
+ # When the queue size reaches `max_queue` subsequent tasks will be rejected in
50
+ # accordance with the configured `fallback_policy`.
51
+
52
+ # @!macro [new] thread_pool_executor_attr_reader_length
53
+ # The number of threads currently in the pool.
54
+ # @return [Integer] The number of threads currently in the pool.
55
+
56
+ # @!macro [new] thread_pool_executor_attr_reader_queue_length
57
+ # The number of tasks in the queue awaiting execution.
58
+ # @return [Integer] The number of tasks in the queue awaiting execution.
59
+
60
+ # @!macro [new] thread_pool_executor_attr_reader_remaining_capacity
61
+ # Number of tasks that may be enqueued before reaching `max_queue` and rejecting
62
+ # new tasks. A value of -1 indicates that the queue may grow without bound.
63
+ #
64
+ # @return [Integer] Number of tasks that may be enqueued before reaching `max_queue` and rejecting
65
+ # new tasks. A value of -1 indicates that the queue may grow without bound.
66
+
67
+
68
+
69
+
70
+
71
+ # @!macro [new] thread_pool_executor_public_api
72
+ #
73
+ # @!macro abstract_executor_service_public_api
74
+ #
75
+ # @!attribute [r] max_length
76
+ # @!macro thread_pool_executor_attr_reader_max_length
77
+ #
78
+ # @!attribute [r] min_length
79
+ # @!macro thread_pool_executor_attr_reader_min_length
80
+ #
81
+ # @!attribute [r] largest_length
82
+ # @!macro thread_pool_executor_attr_reader_largest_length
83
+ #
84
+ # @!attribute [r] scheduled_task_count
85
+ # @!macro thread_pool_executor_attr_reader_scheduled_task_count
86
+ #
87
+ # @!attribute [r] completed_task_count
88
+ # @!macro thread_pool_executor_attr_reader_completed_task_count
89
+ #
90
+ # @!attribute [r] idletime
91
+ # @!macro thread_pool_executor_attr_reader_idletime
92
+ #
93
+ # @!attribute [r] max_queue
94
+ # @!macro thread_pool_executor_attr_reader_max_queue
95
+ #
96
+ # @!attribute [r] length
97
+ # @!macro thread_pool_executor_attr_reader_length
98
+ #
99
+ # @!attribute [r] queue_length
100
+ # @!macro thread_pool_executor_attr_reader_queue_length
101
+ #
102
+ # @!attribute [r] remaining_capacity
103
+ # @!macro thread_pool_executor_attr_reader_remaining_capacity
104
+ #
105
+ # @!method can_overflow?
106
+ # @!macro executor_service_method_can_overflow_question
107
+
108
+
109
+
110
+
111
+ # @!macro [new] thread_pool_options
112
+ #
113
+ # **Thread Pool Options**
114
+ #
115
+ # Thread pools support several configuration options:
116
+ #
117
+ # * `idletime`: The number of seconds that a thread may be idle before being reclaimed.
118
+ # * `max_queue`: The maximum number of tasks that may be waiting in the work queue at
119
+ # any one time. When the queue size reaches `max_queue` subsequent tasks will be
120
+ # rejected in accordance with the configured `fallback_policy`.
121
+ # * `auto_terminate`: When true (default) an `at_exit` handler will be registered which
122
+ # will stop the thread pool when the application exits. See below for more information
123
+ # on shutting down thread pools.
124
+ # * `fallback_policy`: The policy defining how rejected tasks are handled.
125
+ #
126
+ # Three fallback policies are supported:
127
+ #
128
+ # * `:abort`: Raise a `RejectedExecutionError` exception and discard the task.
129
+ # * `:discard`: Discard the task and return false.
130
+ # * `:caller_runs`: Execute the task on the calling thread.
131
+ #
132
+ # **Shutting Down Thread Pools**
133
+ #
134
+ # Killing a thread pool while tasks are still being processed, either by calling
135
+ # the `#kill` method or at application exit, will have unpredictable results. There
136
+ # is no way for the thread pool to know what resources are being used by the
137
+ # in-progress tasks. When those tasks are killed the impact on those resources
138
+ # cannot be predicted. The *best* practice is to explicitly shutdown all thread
139
+ # pools using the provided methods:
140
+ #
141
+ # * Call `#shutdown` to initiate an orderly termination of all in-progress tasks
142
+ # * Call `#wait_for_termination` with an appropriate timeout interval an allow
143
+ # the orderly shutdown to complete
144
+ # * Call `#kill` *only when* the thread pool fails to shutdown in the allotted time
145
+ #
146
+ # On some runtime platforms (most notably the JVM) the application will not
147
+ # exit until all thread pools have been shutdown. To prevent applications from
148
+ # "hanging" on exit all thread pools include an `at_exit` handler that will
149
+ # stop the thread pool when the application exists. This handler uses a brute
150
+ # force method to stop the pool and makes no guarantees regarding resources being
151
+ # used by any tasks still running. Registration of this `at_exit` handler can be
152
+ # prevented by setting the thread pool's constructor `:auto_terminate` option to
153
+ # `false` when the thread pool is created. All thread pools support this option.
154
+ #
155
+ # ```ruby
156
+ # pool1 = Concurrent::FixedThreadPool.new(5) # an `at_exit` handler will be registered
157
+ # pool2 = Concurrent::FixedThreadPool.new(5, auto_terminate: false) # prevent `at_exit` handler registration
158
+ # ```
159
+ #
160
+ # @note Failure to properly shutdown a thread pool can lead to unpredictable results.
161
+ # Please read *Shutting Down Thread Pools* for more information.
162
+ #
163
+ # @see http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html Java Tutorials: Thread Pools
164
+ # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html Java Executors class
165
+ # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html Java ExecutorService interface
166
+ # @see http://ruby-doc.org//core-2.2.0/Kernel.html#method-i-at_exit Kernel#at_exit
167
+
168
+
169
+
170
+
171
+
172
+ # @!macro [attach] fixed_thread_pool
173
+ #
174
+ # A thread pool with a set number of threads. The number of threads in the pool
175
+ # is set on construction and remains constant. When all threads are busy new
176
+ # tasks `#post` to the thread pool are enqueued until a thread becomes available.
177
+ # Should a thread crash for any reason the thread will immediately be removed
178
+ # from the pool and replaced.
179
+ #
180
+ # The API and behavior of this class are based on Java's `FixedThreadPool`
181
+ #
182
+ # @!macro thread_pool_options
183
+ class FixedThreadPool < ThreadPoolExecutor
184
+
185
+ # @!macro [attach] fixed_thread_pool_method_initialize
14
186
  #
15
- # The API and behavior of this class are based on Java's `FixedThreadPool`
187
+ # Create a new thread pool.
16
188
  #
17
- # @note When running on the JVM (JRuby) this class will inherit from `JavaFixedThreadPool`.
18
- # On all other platforms it will inherit from `RubyFixedThreadPool`.
189
+ # @param [Integer] num_threads the number of threads to allocate
190
+ # @param [Hash] opts the options defining pool behavior.
191
+ # @option opts [Symbol] :fallback_policy (`:abort`) the fallback policy
19
192
  #
20
- # @see Concurrent::RubyFixedThreadPool
21
- # @see Concurrent::JavaFixedThreadPool
193
+ # @raise [ArgumentError] if `num_threads` is less than or equal to zero
194
+ # @raise [ArgumentError] if `fallback_policy` is not a known policy
22
195
  #
23
- # @see http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html
24
- # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html
25
- # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html
26
- class FixedThreadPool < JavaFixedThreadPool
27
- end
28
- else
29
- # @!macro fixed_thread_pool
30
- class FixedThreadPool < RubyFixedThreadPool
196
+ # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool-int-
197
+ def initialize(num_threads, opts = {})
198
+ raise ArgumentError.new('number of threads must be greater than zero') if num_threads.to_i < 1
199
+ defaults = { max_queue: DEFAULT_MAX_QUEUE_SIZE,
200
+ idletime: DEFAULT_THREAD_IDLETIMEOUT }
201
+ overrides = { min_threads: num_threads,
202
+ max_threads: num_threads }
203
+ super(defaults.merge(opts).merge(overrides))
31
204
  end
32
205
  end
33
206
  end
@@ -1,5 +1,5 @@
1
1
  require 'concurrent/atomic/event'
2
- require 'concurrent/executor/executor'
2
+ require 'concurrent/executor/executor_service'
3
3
 
4
4
  module Concurrent
5
5
 
@@ -14,14 +14,14 @@ module Concurrent
14
14
  #
15
15
  # @note Intended for use primarily in testing and debugging.
16
16
  class ImmediateExecutor
17
- include SerialExecutor
17
+ include SerialExecutorService
18
18
 
19
19
  # Creates a new executor
20
20
  def initialize
21
21
  @stopped = Concurrent::Event.new
22
22
  end
23
23
 
24
- # @!macro executor_method_post
24
+ # @!macro executor_service_method_post
25
25
  def post(*args, &task)
26
26
  raise ArgumentError.new('no block given') unless block_given?
27
27
  return false unless running?
@@ -29,35 +29,35 @@ module Concurrent
29
29
  true
30
30
  end
31
31
 
32
- # @!macro executor_method_left_shift
32
+ # @!macro executor_service_method_left_shift
33
33
  def <<(task)
34
34
  post(&task)
35
35
  self
36
36
  end
37
37
 
38
- # @!macro executor_method_running_question
38
+ # @!macro executor_service_method_running_question
39
39
  def running?
40
40
  ! shutdown?
41
41
  end
42
42
 
43
- # @!macro executor_method_shuttingdown_question
43
+ # @!macro executor_service_method_shuttingdown_question
44
44
  def shuttingdown?
45
45
  false
46
46
  end
47
47
 
48
- # @!macro executor_method_shutdown_question
48
+ # @!macro executor_service_method_shutdown_question
49
49
  def shutdown?
50
50
  @stopped.set?
51
51
  end
52
52
 
53
- # @!macro executor_method_shutdown
53
+ # @!macro executor_service_method_shutdown
54
54
  def shutdown
55
55
  @stopped.set
56
56
  true
57
57
  end
58
58
  alias_method :kill, :shutdown
59
59
 
60
- # @!macro executor_method_wait_for_termination
60
+ # @!macro executor_service_method_wait_for_termination
61
61
  def wait_for_termination(timeout = nil)
62
62
  @stopped.wait(timeout)
63
63
  end
@@ -1,4 +1,5 @@
1
- require 'concurrent/executor/executor'
1
+ require 'concurrent/executor/immediate_executor'
2
+ require 'concurrent/executor/simple_executor_service'
2
3
 
3
4
  module Concurrent
4
5
  # An executor service which runs all operations on a new thread, blocking
@@ -19,10 +20,10 @@ module Concurrent
19
20
  # Creates a new executor
20
21
  def initialize
21
22
  super
22
- @internal_executor = PerThreadExecutor.new
23
+ @internal_executor = SimpleExecutorService.new
23
24
  end
24
25
 
25
- # @!macro executor_method_post
26
+ # @!macro executor_service_method_post
26
27
  def post(*args, &task)
27
28
  raise ArgumentError.new("no block given") unless block_given?
28
29
  return false unless running?
@@ -1,27 +1,28 @@
1
- if RUBY_PLATFORM == 'java'
2
- require_relative 'executor'
1
+ if Concurrent.on_jruby?
2
+
3
+ require 'concurrent/executor/executor_service'
3
4
 
4
5
  module Concurrent
5
6
 
6
7
  # @!macro single_thread_executor
7
- class JavaSingleThreadExecutor
8
- include JavaExecutor
9
- include SerialExecutor
8
+ # @!macro thread_pool_options
9
+ # @!macro abstract_executor_service_public_api
10
+ # @!visibility private
11
+ class JavaSingleThreadExecutor < JavaExecutorService
12
+ include SerialExecutorService
10
13
 
11
- # Create a new thread pool.
12
- #
13
- # @option opts [Symbol] :fallback_policy (:discard) the policy
14
- # for handling new tasks that are received when the queue size
15
- # has reached `max_queue` or after the executor has shut down
16
- #
17
- # @see http://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html
18
- # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html
19
- # @see http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html
14
+ # @!macro single_thread_executor_method_initialize
20
15
  def initialize(opts = {})
16
+ super(opts)
17
+ end
18
+
19
+ protected
20
+
21
+ def ns_initialize(opts)
21
22
  @executor = java.util.concurrent.Executors.newSingleThreadExecutor
22
23
  @fallback_policy = opts.fetch(:fallback_policy, :discard)
23
- raise ArgumentError.new("#{@fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICIES.keys.include?(@fallback_policy)
24
- set_shutdown_hook
24
+ raise ArgumentError.new("#{@fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICY_CLASSES.keys.include?(@fallback_policy)
25
+ self.auto_terminate = opts.fetch(:auto_terminate, true)
25
26
  end
26
27
  end
27
28
  end
@@ -1,168 +1,121 @@
1
- if RUBY_PLATFORM == 'java'
2
- require_relative 'executor'
1
+ if Concurrent.on_jruby?
2
+
3
+ require 'concurrent/executor/executor_service'
3
4
 
4
5
  module Concurrent
5
6
 
6
7
  # @!macro thread_pool_executor
7
- class JavaThreadPoolExecutor
8
- include JavaExecutor
8
+ # @!macro thread_pool_options
9
+ # @!visibility private
10
+ class JavaThreadPoolExecutor < JavaExecutorService
9
11
 
10
- # Default maximum number of threads that will be created in the pool.
12
+ # @!macro thread_pool_executor_constant_default_max_pool_size
11
13
  DEFAULT_MAX_POOL_SIZE = java.lang.Integer::MAX_VALUE # 2147483647
12
14
 
13
- # Default minimum number of threads that will be retained in the pool.
15
+ # @!macro thread_pool_executor_constant_default_min_pool_size
14
16
  DEFAULT_MIN_POOL_SIZE = 0
15
17
 
16
- # Default maximum number of tasks that may be added to the task queue.
18
+ # @!macro thread_pool_executor_constant_default_max_queue_size
17
19
  DEFAULT_MAX_QUEUE_SIZE = 0
18
20
 
19
- # Default maximum number of seconds a thread in the pool may remain idle
20
- # before being reclaimed.
21
+ # @!macro thread_pool_executor_constant_default_thread_timeout
21
22
  DEFAULT_THREAD_IDLETIMEOUT = 60
22
23
 
23
- # The maximum number of threads that may be created in the pool.
24
+ # @!macro thread_pool_executor_attr_reader_max_length
24
25
  attr_reader :max_length
25
26
 
26
- # The maximum number of tasks that may be waiting in the work queue at any one time.
27
- # When the queue size reaches `max_queue` subsequent tasks will be rejected in
28
- # accordance with the configured `fallback_policy`.
27
+ # @!macro thread_pool_executor_attr_reader_max_queue
29
28
  attr_reader :max_queue
30
29
 
31
- # Create a new thread pool.
32
- #
33
- # @param [Hash] opts the options which configure the thread pool
34
- #
35
- # @option opts [Integer] :max_threads (DEFAULT_MAX_POOL_SIZE) the maximum
36
- # number of threads to be created
37
- # @option opts [Integer] :min_threads (DEFAULT_MIN_POOL_SIZE) the minimum
38
- # number of threads to be retained
39
- # @option opts [Integer] :idletime (DEFAULT_THREAD_IDLETIMEOUT) the maximum
40
- # number of seconds a thread may be idle before being reclaimed
41
- # @option opts [Integer] :max_queue (DEFAULT_MAX_QUEUE_SIZE) the maximum
42
- # number of tasks allowed in the work queue at any one time; a value of
43
- # zero means the queue may grow without bound
44
- # @option opts [Symbol] :fallback_policy (:abort) the policy for handling new
45
- # tasks that are received when the queue size has reached
46
- # `max_queue` or the executir has shut down
47
- #
48
- # @raise [ArgumentError] if `:max_threads` is less than one
49
- # @raise [ArgumentError] if `:min_threads` is less than zero
50
- # @raise [ArgumentError] if `:fallback_policy` is not one of the values specified
51
- # in `FALLBACK_POLICIES`
52
- #
53
- # @see http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ThreadPoolExecutor.html
30
+ # @!macro thread_pool_executor_method_initialize
54
31
  def initialize(opts = {})
55
- min_length = opts.fetch(:min_threads, DEFAULT_MIN_POOL_SIZE).to_i
56
- max_length = opts.fetch(:max_threads, DEFAULT_MAX_POOL_SIZE).to_i
57
- idletime = opts.fetch(:idletime, DEFAULT_THREAD_IDLETIMEOUT).to_i
58
- @max_queue = opts.fetch(:max_queue, DEFAULT_MAX_QUEUE_SIZE).to_i
59
- @fallback_policy = opts.fetch(:fallback_policy, opts.fetch(:overflow_policy, :abort))
60
- warn '[DEPRECATED] :overflow_policy is deprecated terminology, please use :fallback_policy instead' if opts.has_key?(:overflow_policy)
61
-
62
- raise ArgumentError.new('max_threads must be greater than zero') if max_length <= 0
63
- raise ArgumentError.new('min_threads cannot be less than zero') if min_length < 0
64
- raise ArgumentError.new('min_threads cannot be more than max_threads') if min_length > max_length
65
- raise ArgumentError.new("#{fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICIES.include?(@fallback_policy)
66
-
67
- if @max_queue == 0
68
- queue = java.util.concurrent.LinkedBlockingQueue.new
69
- else
70
- queue = java.util.concurrent.LinkedBlockingQueue.new(@max_queue)
71
- end
72
-
73
- @executor = java.util.concurrent.ThreadPoolExecutor.new(
74
- min_length, max_length,
75
- idletime, java.util.concurrent.TimeUnit::SECONDS,
76
- queue, FALLBACK_POLICIES[@fallback_policy].new)
77
-
78
- set_shutdown_hook
32
+ super(opts)
79
33
  end
80
34
 
81
- # @!macro executor_module_method_can_overflow_question
35
+ # @!macro executor_service_method_can_overflow_question
82
36
  def can_overflow?
83
37
  @max_queue != 0
84
38
  end
85
39
 
86
- # The minimum number of threads that may be retained in the pool.
87
- #
88
- # @return [Integer] the min_length
40
+ # @!macro thread_pool_executor_attr_reader_min_length
89
41
  def min_length
90
42
  @executor.getCorePoolSize
91
43
  end
92
44
 
93
- # The maximum number of threads that may be created in the pool.
94
- #
95
- # @return [Integer] the max_length
45
+ # @!macro thread_pool_executor_attr_reader_max_length
96
46
  def max_length
97
47
  @executor.getMaximumPoolSize
98
48
  end
99
49
 
100
- # The number of threads currently in the pool.
101
- #
102
- # @return [Integer] the length
50
+ # @!macro thread_pool_executor_attr_reader_length
103
51
  def length
104
52
  @executor.getPoolSize
105
53
  end
106
- alias_method :current_length, :length
107
54
 
108
- # The largest number of threads that have been created in the pool since construction.
109
- #
110
- # @return [Integer] the largest_length
55
+ # @!macro thread_pool_executor_attr_reader_largest_length
111
56
  def largest_length
112
57
  @executor.getLargestPoolSize
113
58
  end
114
59
 
115
- # The number of tasks that have been scheduled for execution on the pool since construction.
116
- #
117
- # @return [Integer] the scheduled_task_count
60
+ # @!macro thread_pool_executor_attr_reader_scheduled_task_count
118
61
  def scheduled_task_count
119
62
  @executor.getTaskCount
120
63
  end
121
64
 
122
- # The number of tasks that have been completed by the pool since construction.
123
- #
124
- # @return [Integer] the completed_task_count
65
+ # @!macro thread_pool_executor_attr_reader_completed_task_count
125
66
  def completed_task_count
126
67
  @executor.getCompletedTaskCount
127
68
  end
128
69
 
129
- # The number of seconds that a thread may be idle before being reclaimed.
130
- #
131
- # @return [Integer] the idletime
70
+ # @!macro thread_pool_executor_attr_reader_idletime
132
71
  def idletime
133
72
  @executor.getKeepAliveTime(java.util.concurrent.TimeUnit::SECONDS)
134
73
  end
135
74
 
136
- # The number of tasks in the queue awaiting execution.
137
- #
138
- # @return [Integer] the queue_length
75
+ # @!macro thread_pool_executor_attr_reader_queue_length
139
76
  def queue_length
140
77
  @executor.getQueue.size
141
78
  end
142
79
 
143
- # Number of tasks that may be enqueued before reaching `max_queue` and rejecting
144
- # new tasks. A value of -1 indicates that the queue may grow without bound.
145
- #
146
- # @return [Integer] the remaining_capacity
80
+ # @!macro thread_pool_executor_attr_reader_remaining_capacity
147
81
  def remaining_capacity
148
82
  @max_queue == 0 ? -1 : @executor.getQueue.remainingCapacity
149
83
  end
150
84
 
151
- # This method is deprecated and will be removed soon.
152
- # This method is supost to return the threads status, but Java API doesn't
153
- # provide a way to get the thread status. So we return an empty Array instead.
154
- def status
155
- warn '[DEPRECATED] `status` is deprecated and will be removed soon.'
156
- warn "Calls to `status` return an empty Array. Java ThreadPoolExecutor does not provide thread's status."
157
- []
158
- end
159
-
160
- # Is the thread pool running?
161
- #
162
- # @return [Boolean] `true` when running, `false` when shutting down or shutdown
85
+ # @!macro executor_service_method_running_question
163
86
  def running?
164
87
  super && !@executor.isTerminating
165
88
  end
89
+
90
+ protected
91
+
92
+ def ns_initialize(opts)
93
+ min_length = opts.fetch(:min_threads, DEFAULT_MIN_POOL_SIZE).to_i
94
+ max_length = opts.fetch(:max_threads, DEFAULT_MAX_POOL_SIZE).to_i
95
+ idletime = opts.fetch(:idletime, DEFAULT_THREAD_IDLETIMEOUT).to_i
96
+ @max_queue = opts.fetch(:max_queue, DEFAULT_MAX_QUEUE_SIZE).to_i
97
+ @fallback_policy = opts.fetch(:fallback_policy, opts.fetch(:overflow_policy, :abort))
98
+ deprecated ' :overflow_policy is deprecated terminology, please use :fallback_policy instead' if opts.has_key?(:overflow_policy)
99
+
100
+ raise ArgumentError.new("`max_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if max_length < DEFAULT_MIN_POOL_SIZE
101
+ raise ArgumentError.new("`max_threads` cannot be greater than #{DEFAULT_MAX_POOL_SIZE}") if max_length > DEFAULT_MAX_POOL_SIZE
102
+ raise ArgumentError.new("`min_threads` cannot be less than #{DEFAULT_MIN_POOL_SIZE}") if min_length < DEFAULT_MIN_POOL_SIZE
103
+ raise ArgumentError.new("`min_threads` cannot be more than `max_threads`") if min_length > max_length
104
+ raise ArgumentError.new("#{fallback_policy} is not a valid fallback policy") unless FALLBACK_POLICY_CLASSES.include?(@fallback_policy)
105
+
106
+ if @max_queue == 0
107
+ queue = java.util.concurrent.LinkedBlockingQueue.new
108
+ else
109
+ queue = java.util.concurrent.LinkedBlockingQueue.new(@max_queue)
110
+ end
111
+
112
+ @executor = java.util.concurrent.ThreadPoolExecutor.new(
113
+ min_length, max_length,
114
+ idletime, java.util.concurrent.TimeUnit::SECONDS,
115
+ queue, FALLBACK_POLICY_CLASSES[@fallback_policy].new)
116
+
117
+ self.auto_terminate = opts.fetch(:auto_terminate, true)
118
+ end
166
119
  end
167
120
  end
168
121
  end