Rumah > Java > javaTutorial > teks badan

Bagaimana untuk menyelesaikan masalah kumpulan benang di Jawa

王林
Lepaskan: 2023-10-08 09:12:42
asal
1108 orang telah melayarinya

Bagaimana untuk menyelesaikan masalah kumpulan benang di Jawa

Cara menyelesaikan isu kumpulan benang dalam Java

Dalam pengaturcaraan berbilang benang moden, menggunakan kumpulan benang ialah cara biasa dan berkesan untuk mengurus sumber benang. Walau bagaimanapun, apabila menggunakan kumpulan benang dalam Java, kami mungkin menghadapi beberapa masalah, seperti tetapan saiz kolam benang, strategi penolakan, dsb. Artikel ini menerangkan beberapa cara untuk menyelesaikan masalah ini dan menyediakan contoh kod khusus.

  1. Saiz kolam benang

Saiz kolam benang harus mengambil kira sumber pemproses yang ada dan jenis tugasan. Jika tugas itu intensif CPU, maka saiz kumpulan benang hendaklah hampir atau sama dengan bilangan teras pemproses untuk menggunakan sepenuhnya sumber pemproses. Jika tugas itu intensif IO, saiz kumpulan benang hendaklah lebih besar daripada bilangan teras pemproses untuk menggunakan sepenuhnya masa CPU menunggu operasi IO.

Berikut ialah contoh kod untuk menetapkan saiz kumpulan benang:

int corePoolSize = Runtime.getRuntime().availableProcessors();
int maximumPoolSize = corePoolSize * 2;
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>());
Salin selepas log masuk
  1. Dasar penolakan

Dasar penolakan dicetuskan apabila kumpulan benang tidak dapat menerima tugas baharu. Java menyediakan beberapa strategi penolakan, seperti mengabaikan tugas baru, membuang pengecualian, membuang tugas tertua, dsb. Walau bagaimanapun, dasar penolakan lalai ini mungkin tidak sesuai untuk semua senario.

Berikut ialah contoh kod dasar penolakan tersuai:

ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.DiscardPolicy());

executor.setRejectedExecutionHandler(new RejectedExecutionHandler() {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
        if (!executor.isShutdown()) {
            try {
                executor.getQueue().put(r);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
});
Salin selepas log masuk

Dalam contoh di atas, kami menggunakan dasar penolakan tersuai untuk meletakkan semula tugasan yang ditolak ke dalam baris gilir kumpulan benang.

  1. Pemantauan dan penalaan kolam benang

Untuk pemantauan dan penalaan kolam benang, kami boleh menggunakan antara muka executorService yang disediakan oleh Java untuk mendapatkan maklumat status kolam benang, seperti bilangan utas aktif, panjang giliran tugas, dsb. . Kami juga boleh menala prestasi kumpulan benang dengan menetapkan parameter yang sesuai, seperti saiz kolam teras, saiz kolam maksimum, masa menunggu benang, dsb.

Berikut ialah contoh kod untuk pemantauan dan penalaan kumpulan benang:

ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, 1, TimeUnit.MINUTES, new LinkedBlockingQueue<>());
ExecutorService executorService = Executors.unconfigurableExecutorService(executor);

ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
scheduledExecutorService.scheduleAtFixedRate(() -> {
    int activeCount = executor.getActiveCount();
    long completedTaskCount = executor.getCompletedTaskCount();
    long taskCount = executor.getTaskCount();
    int queueSize = executor.getQueue().size();
    System.out.println("Active threads: " + activeCount);
    System.out.println("Completed tasks: " + completedTaskCount);
    System.out.println("Total tasks: " + taskCount);
    System.out.println("Queue size: " + queueSize);
}, 0, 1, TimeUnit.SECONDS);
Salin selepas log masuk

Dalam contoh di atas, kami menggunakan ScheduledExecutorService untuk mencetak maklumat status kumpulan benang secara kerap.

Ringkasnya, kami boleh menyelesaikan masalah pool thread di Jawa mengikut keperluan khusus. Dengan menetapkan saiz kumpulan benang dengan betul, memilih strategi penolakan yang sesuai, dan memantau serta menala kumpulan benang, kami boleh meningkatkan prestasi dan kestabilan program berbilang benang.

Di atas ialah cara menyelesaikan masalah thread pool di Jawa.

Atas ialah kandungan terperinci Bagaimana untuk menyelesaikan masalah kumpulan benang di Jawa. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan