Java thread pool stop thread

Class ThreadPoolExecutor

An ExecutorService that executes each submitted task using one of possibly several pooled threads, normally configured using Executors factory methods.

Thread pools address two different problems: they usually provide improved performance when executing large numbers of asynchronous tasks, due to reduced per-task invocation overhead, and they provide a means of bounding and managing the resources, including threads, consumed when executing a collection of tasks. Each ThreadPoolExecutor also maintains some basic statistics, such as the number of completed tasks.

  • If fewer than corePoolSize threads are running, the Executor always prefers adding a new thread rather than queuing.
  • If corePoolSize or more threads are running, the Executor always prefers queuing a request rather than adding a new thread.
  • If a request cannot be queued, a new thread is created unless this would exceed maximumPoolSize, in which case, the task will be rejected.
  1. Direct handoffs. A good default choice for a work queue is a SynchronousQueue that hands off tasks to threads without otherwise holding them. Here, an attempt to queue a task will fail if no threads are immediately available to run it, so a new thread will be constructed. This policy avoids lockups when handling sets of requests that might have internal dependencies. Direct handoffs generally require unbounded maximumPoolSizes to avoid rejection of new submitted tasks. This in turn admits the possibility of unbounded thread growth when commands continue to arrive on average faster than they can be processed.
  2. Unbounded queues. Using an unbounded queue (for example a LinkedBlockingQueue without a predefined capacity) will cause new tasks to wait in the queue when all corePoolSize threads are busy. Thus, no more than corePoolSize threads will ever be created. (And the value of the maximumPoolSize therefore doesn’t have any effect.) This may be appropriate when each task is completely independent of others, so tasks cannot affect each others execution; for example, in a web page server. While this style of queuing can be useful in smoothing out transient bursts of requests, it admits the possibility of unbounded work queue growth when commands continue to arrive on average faster than they can be processed.
  3. Bounded queues. A bounded queue (for example, an ArrayBlockingQueue ) helps prevent resource exhaustion when used with finite maximumPoolSizes, but can be more difficult to tune and control. Queue sizes and maximum pool sizes may be traded off for each other: Using large queues and small pools minimizes CPU usage, OS resources, and context-switching overhead, but can lead to artificially low throughput. If tasks frequently block (for example if they are I/O bound), a system may be able to schedule time for more threads than you otherwise allow. Use of small queues generally requires larger pool sizes, which keeps CPUs busier but may encounter unacceptable scheduling overhead, which also decreases throughput.
  1. In the default ThreadPoolExecutor.AbortPolicy , the handler throws a runtime RejectedExecutionException upon rejection.
  2. In ThreadPoolExecutor.CallerRunsPolicy , the thread that invokes execute itself runs the task. This provides a simple feedback control mechanism that will slow down the rate that new tasks are submitted.
  3. In ThreadPoolExecutor.DiscardPolicy , a task that cannot be executed is simply dropped. This policy is designed only for those rare cases in which task completion is never relied upon.
  4. In ThreadPoolExecutor.DiscardOldestPolicy , if the executor is not shut down, the task at the head of the work queue is dropped, and then execution is retried (which can fail again, causing this to be repeated.) This policy is rarely acceptable. In nearly all cases, you should also cancel the task to cause an exception in any component waiting for its completion, and/or log the failure, as illustrated in ThreadPoolExecutor.DiscardOldestPolicy documentation.
Читайте также:  Как задать промежуток питон

If hook, callback, or BlockingQueue methods throw exceptions, internal worker threads may in turn fail, abruptly terminate, and possibly be replaced.

Queue maintenance Method getQueue() allows access to the work queue for purposes of monitoring and debugging. Use of this method for any other purpose is strongly discouraged. Two supplied methods, remove(Runnable) and purge() are available to assist in storage reclamation when large numbers of queued tasks become cancelled. Reclamation A pool that is no longer referenced in a program AND has no remaining threads may be reclaimed (garbage collected) without being explicitly shutdown. You can configure a pool to allow all unused threads to eventually die by setting appropriate keep-alive times, using a lower bound of zero core threads and/or setting allowCoreThreadTimeOut(boolean) .

Extension example. Most extensions of this class override one or more of the protected hook methods. For example, here is a subclass that adds a simple pause/resume feature:

 class PausableThreadPoolExecutor extends ThreadPoolExecutor < private boolean isPaused; private ReentrantLock pauseLock = new ReentrantLock(); private Condition unpaused = pauseLock.newCondition(); public PausableThreadPoolExecutor(. ) < super(. ); >protected void beforeExecute(Thread t, Runnable r) < super.beforeExecute(t, r); pauseLock.lock(); try < while (isPaused) unpaused.await(); >catch (InterruptedException ie) < t.interrupt(); >finally < pauseLock.unlock(); >> public void pause() < pauseLock.lock(); try < isPaused = true; >finally < pauseLock.unlock(); >> public void resume() < pauseLock.lock(); try < isPaused = false; unpaused.signalAll(); >finally < pauseLock.unlock(); >> >

Источник

One: Five ways to stop thread pool;

(1)The shutdown method is to turn off the thread pool;

(2)However, the thread pool does not necessarily stop immediately after this method is executed;

● This is because Shutdown is only initialized the entire shutdown process;

● For example, when the thread pool is executed, there is a task that is executing in the thread, and there may be tasks waiting to be performed in the queue; so, after we call the shutdown method, the entire thread pool can stop;

● After we call the shutdown method, the thread pool will know [We want to stop the thread pool «; this time, for the sake of safety, the thread pool will perform the tasks in the task and the task in the queue. After it is closed again;

● Nature, after we call the shutdown method, if there is a new task, the thread pool will refuse;

(2) SHUTDOWN method, demo;

package threadPool; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * Demonstrate shutdown methods for closing the thread pool; */ public class ShutDown < public static void main(String[] args) throws InterruptedException < ExecutorService executorService = Executors.newFixedThreadPool(10); for (int i = 0; i Thread.sleep(1500); executorService.shutdown(); executorService.execute(new ShutDownTask()); > > class ShutDownTask implements Runnable < @Override public void run() < try < Thread.sleep(500); System.out.println(Thread.currentThread().getName()); >catch (InterruptedException e) < e.printStackTrace(); >> > 

illustrate:

(1)Logical description;

(2)running result;

(3)However, after calling the shutdown method to turn off the thread, if the thread can’t turn it immediately; do we only see the shutdown is determined in factually implemented by [Way to add tasks to the thread pool]? : Obviously, it will be introduced below, you can implement this need;

2.Iseshutdown method: Check if the thread pool has entered the stop state;

If, we have implemented the shutdown method, and the ISSHUTDOWN method returns true;

illustrate:

(1)Still emphasizing: We have implemented the shutdown method, and the ISSHUTDOWN method returns True; isshutdown method returns true, only represents the thread pool is stopped, does not mean that the thread pool is completely stopped (because the thread pool enters the stop state, Waiting for [Task being executed and the task waiting in the queue] can be completely terminated);

(2)So what happens, is the thread pool stopped completely? : The isterminated () method you want to say, you can implement this need;

3.Isterminated method: check if the thread pool has been completely stopped;

……………………………………………………

4.AwaitterMination method: Judging whether the thread pool is completely stopped during the waiting time;

(1)This method is merely used to detect, whether the thread pool is completely stopped within the waiting time set;

(2)[AWAITTERMINATION method, can you call】 There is no relationship with [there is no call shutdown];

……………………………………………………

5. SHUTDOWNNOW method: No matter whether there is a remaining task in the thread pool, immediately stop the thread pool;

(1)Then, the thread that is executing the task is interrupted; the queue is queuing the task, will return;

……………………………………………………

operation result:

​​​​​​​

Источник

Оцените статью