it-swarm-vi.tech

Chủ đề hoạt động trong ExecutorService

Mọi ý tưởng làm thế nào để xác định số lượng chủ đề đang hoạt động hiện đang chạy trong một ExecutorService ?

58
zanussi

Sử dụng một ThreadPoolExecutor triển khai và gọi getActiveCount () trên đó:

int getActiveCount() 
// Returns the approximate number of threads that are actively executing tasks.

Giao diện ExecutorService không cung cấp một phương thức cho điều đó, nó phụ thuộc vào việc thực hiện.

63
Daan

Giả sử pool là tên của phiên bản ExecutorService:

if (pool instanceof ThreadPoolExecutor) {
    System.out.println(
        "Pool size is now " +
        ((ThreadPoolExecutor) pool).getActiveCount()
    );
}
24
andyroid

Kiểm tra mã nguồn cho Executors.newFixedThreadPool ():

return new ThreadPoolExecutor(nThreads, nThreads,
                              0L, TimeUnit.MILLISECONDS,
                              new LinkedBlockingQueue<Runnable>());

ThreadPoolExecutor có phương thức getActiveCount (). Vì vậy, bạn có thể sử dụng ExecutorService cho ThreadPoolExecutor, oder sử dụng mã trên để lấy một mã. Sau đó, bạn có thể gọi getActiveCount ().

21
Arno

Giao diện ExecutorService không định nghĩa một phương thức để kiểm tra số lượng luồng công nhân trong nhóm, vì đây là một chi tiết triển khai

public int getPoolSize()
Returns the current number of threads in the pool.

Có sẵn trên lớp ThreadPoolExecutor

[.__.] nhập Java.util.concản. .] [.__.] lớp công khai PoolSize {[.__.] [.__.] public static void main (String [] args) {[.__.] ThreadPoolExecutor execor = new ThreadPoolExecutor (10, 20, 60L, TimeUnit .SECONDS, LinkedBlockingQueue ()); [.__.] System.out.println (execor.getPoolSize ()); [.__.]} [.__.]} [.__.]

Nhưng điều này đòi hỏi bạn phải tạo ra ThreadPoolExecutor một cách rõ ràng, thay vì sử dụng nhà máy Executors trả về các đối tượng ExecutorService. Bạn luôn có thể tạo nhà máy của riêng mình trả về ThreadPoolExecutors, nhưng bạn vẫn sẽ gặp phải hình thức xấu khi sử dụng loại cụ thể, không phải giao diện của nó.

Một khả năng có thể là cung cấp ThreadFactory của riêng bạn để tạo các luồng trong một nhóm luồng đã biết, sau đó bạn có thể đếm

[.__.] nhập Java.util.concản.ExecutorService; [.__.] nhập Java.util.concản.Executors; [.__.] nhập Java.util.concản.ThreadFactory; [.__.] [.___ .] [.__.] lớp công khai PoolSize2 {[.__.] [.__.] public static void main (String [] args) {[.__.] Final Threadgroup threadgroup = new Threadgroup ("worker"); [ .___.] [.___.] ExecutorService execor = Executors.newCachedThreadPool (new ThreadFactory () {[.__.] Công khai Chủ đề newThread (Runnable r) {[.__.] Trả về chủ đề mới (threadgroup, r); 
} [.__.]}); [.__.] [.__.] System.out.println (threadgroup.activeCount ()); [.__.]} [.__.]} [.___ .]
10
Dave Cheney

Tôi có cùng một vấn đề vì vậy đã tạo ra một Runnable đơn giản để theo dõi một cá thể ExecutorService.

import Java.util.concurrent.ExecutorService;
import Java.util.concurrent.ThreadPoolExecutor;

public class ExecutorServiceAnalyzer implements Runnable
{
    private final ThreadPoolExecutor threadPoolExecutor;
    private final int timeDiff;

    public ExecutorServiceAnalyzer(ExecutorService executorService, int timeDiff)
    {
        this.timeDiff = timeDiff;
        if (executorService instanceof ThreadPoolExecutor)
        {
            threadPoolExecutor = (ThreadPoolExecutor) executorService;
        }
        else
        {
            threadPoolExecutor = null;
            System.out.println("This executor doesn't support ThreadPoolExecutor ");
        }

    }

    @Override
    public void run()
    {
        if (threadPoolExecutor != null)
        {
            do
            {
                System.out.println("#### Thread Report:: Active:" + threadPoolExecutor.getActiveCount() + " Pool: "
                        + threadPoolExecutor.getPoolSize() + " MaxPool: " + threadPoolExecutor.getMaximumPoolSize()
                        + " ####");
                try
                {
                    Thread.sleep(timeDiff);
                }
                catch (Exception e)
                {
                }
            } while (threadPoolExecutor.getActiveCount() > 1);
            System.out.println("##### Terminating as only 1 thread is active ######");
        }

    }
}

Bạn chỉ có thể sử dụng điều này với người thực thi của bạn để có được trạng thái của ThreadPool

Ex

ExecutorService executorService = Executors.newFixedThreadPool(4);
    executorService.execute(new ExecutorServiceAnalyzer(executorService, 1000));
4
Ankit Katiyar