HarmonyOS taskpool线程数量控制

我们在一些业务场景中需要使用线程池,并且想让线程池中的线程按一定数量排队执行。

比如总共有100个任务,我需要构建一个大小为5的线程池,这样的每次是5个线程同时在执行。每5个一组,直到100个任务全部执行完。

HarmonyOS
2024-08-28 09:36:13
浏览
收藏 0
回答 2
待解决
回答 2
按赞同
/
按时间
鱼弦CTO
1

在 HarmonyOS 中,使用线程池可以有效管理并发任务的执行。要实现一个固定大小的线程池,并让线程按一定数量排队执行,我们可以使用 ​​ThreadPoolExecutor​​ 类来创建和管理我们的线程池。

以下是一个示例,展示如何构建一个大小为 5 的线程池来处理 100 个任务:

### 示例代码

#### 创建线程池及提交任务

import ohos.app.Context;
import ohos.eventhandler.EventHandler;
import ohos.eventhandler.EventRunner;

import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class TaskPoolExample {
    private static final int POOL_SIZE = 5; // 线程池大小
    private static final int TOTAL_TASKS = 100; // 总任务数

    public static void main(String[] args) {
        // 创建一个固定大小为5的线程池
        ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(POOL_SIZE);

        // 提交100个任务到线程池中
        for (int i = 0; i < TOTAL_TASKS; i++) {
            int taskId = i + 1;
            executor.submit(new Task(taskId));
        }
        
        // 关闭线程池
        executor.shutdown();
        
        try {
            // 等待所有任务完成
            boolean allTasksCompleted = executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
            if (allTasksCompleted) {
                System.out.println("所有任务已完成");
            } else {
                System.out.println("等待任务完成超时");
            }
        } catch (InterruptedException e) {
            System.err.println("任务等待被中断: " + e.getMessage());
        }
    }

    // 定义一个任务类,实现Runnable接口
    static class Task implements Runnable {
        private final int taskId;

        public Task(int taskId) {
            this.taskId = taskId;
        }

        @Override
        public void run() {
            System.out.println("任务 " + taskId + " 正在执行");
            // 模拟任务执行时间
            try {
                Thread.sleep(1000); // 这里的睡眠时间可以根据实际任务调整
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                System.err.println("任务 " + taskId + " 被中断");
            }
            System.out.println("任务 " + taskId + " 完成");
        }
    }
}

#### 解释

  1. 初始化线程池:我们使用​​Executors.newFixedThreadPool(POOL_SIZE)​​ 方法创建一个固定大小为 5 的线程池。
  2. 提交任务:通过​​executor.submit(new Task(taskId))​​ 将 100 个任务提交到线程池中。每个任务实现了​​Runnable​​ 接口,在​​run​​ 方法中定义任务的具体执行逻辑。
  3. 关闭线程池:通过​​executor.shutdown()​​ 方法关闭线程池,表示不再接受新任务。
  4. 等待任务完成:使用​​executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS)​​ 方法阻塞当前线程,直到所有任务完成或超时。

此示例会确保每次只有 5 个线程同时在执行任务,当一个任务完成后,下一个任务会被调度执行,直到 100 个任务全部完成。

### 适应 HarmonyOS 环境

如果你是在 HarmonyOS 的某些特定模块(如 UI 线程)中使用线程池,需要注意 HarmonyOS 的应用架构。通常,除非需要进行复杂的后台任务管理,否则建议将这种繁重任务放在服务组件中执行,以避免影响主线程的响应性。

### 小结

通过以上代码,我们可以控制线程池中的线程按一定数量排队执行任务。这样能够保证系统资源的有效利用,同时避免因过多并发任务而导致的性能问题。

分享
微博
QQ
微信
回复
2024-08-28 09:55:33
zxjiu
分享
微博
QQ
微信
回复
2024-08-28 20:26:38
相关问题
Worker和TaskPool线程数量是否有限制
1583浏览 • 1回复 待解决
用数组变量控制组件属性不生效
1501浏览 • 1回复 待解决
TaskPool线程和主线程如何通信
1993浏览 • 1回复 待解决
TaskPool线程内存如何共享
1779浏览 • 1回复 待解决
TaskPool如何跟主线程进行通信
206浏览 • 1回复 待解决
如何使用taskpool实现多线程
719浏览 • 1回复 待解决
HarmonyOS taskpool使用crash
977浏览 • 2回复 待解决
HarmonyOS 关于代理提醒数量的问题
76浏览 • 1回复 待解决
HarmonyOS线程线程切换问题
146浏览 • 1回复 待解决
HarmonyOS 事件独占控制问题
116浏览 • 1回复 待解决
HarmonyOS taskpool数据传输问题
126浏览 • 1回复 待解决
HarmonyOS TaskPool使用首选项报错
130浏览 • 1回复 待解决
taskPool @Concurrent报红
2279浏览 • 1回复 待解决