如何在Java父子線程中實(shí)現(xiàn)任務(wù)分配

小樊
82
2024-09-07 12:11:05

在Java中,可以使用ExecutorServiceFuture來(lái)實(shí)現(xiàn)父子線程之間的任務(wù)分配

  1. 創(chuàng)建一個(gè)ExecutorService實(shí)例,它將負(fù)責(zé)管理線程池。線程池的大小取決于你想要同時(shí)運(yùn)行的線程數(shù)量。
int threadPoolSize = 4; // 可以根據(jù)需要調(diào)整線程池大小
ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
  1. 將子任務(wù)分配給線程池中的線程。為此,需要?jiǎng)?chuàng)建一個(gè)Callable實(shí)例,該實(shí)例表示要執(zhí)行的任務(wù)。然后,使用executorService.submit()方法將任務(wù)提交給線程池。submit()方法將返回一個(gè)Future對(duì)象,表示異步計(jì)算的結(jié)果。
List<Future<String>> futures = new ArrayList<>();

for (int i = 0; i < 10; i++) { // 假設(shè)有10個(gè)子任務(wù)
    final int taskId = i;
    Callable<String> task = () -> {
        // 在這里執(zhí)行子任務(wù)
        System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());
        return "Task " + taskId + " completed";
    };
    Future<String> future = executorService.submit(task);
    futures.add(future);
}
  1. 等待所有子任務(wù)完成并獲取結(jié)果??梢允褂?code>Future.get()方法來(lái)獲取每個(gè)任務(wù)的結(jié)果。如果任務(wù)尚未完成,get()方法將阻塞,直到任務(wù)完成。
for (Future<String> future : futures) {
    String result = future.get(); // 獲取子任務(wù)的結(jié)果,如果任務(wù)尚未完成,則阻塞
    System.out.println(result);
}
  1. 關(guān)閉ExecutorService以釋放資源。
executorService.shutdown();

將上述代碼片段組合在一起,可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的父子線程任務(wù)分配示例:

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class ParentChildTaskAssignment {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        int threadPoolSize = 4;
        ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);

        List<Future<String>> futures = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            final int taskId = i;
            Callable<String> task = () -> {
                System.out.println("Task " + taskId + " is running by " + Thread.currentThread().getName());
                return "Task " + taskId + " completed";
            };
            Future<String> future = executorService.submit(task);
            futures.add(future);
        }

        for (Future<String> future : futures) {
            String result = future.get();
            System.out.println(result);
        }

        executorService.shutdown();
    }
}

這個(gè)示例將創(chuàng)建一個(gè)固定大小的線程池,將10個(gè)子任務(wù)分配給線程池中的線程,并等待所有任務(wù)完成。然后,它將輸出每個(gè)任務(wù)的結(jié)果。

0