线程讲解(十六)

fork join框架使用简单实例

使用RecursiveTask实现一个累加的功能,使用分而治之的思想,实现分段求和后汇总。

public class SumTask extends RecursiveTask<Integer> {
    private Integer start = 0;
    private Integer end = 0;

    public SumTask(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {

        if (end - start < 100) {
            //小于100时直接返回结果
            int sumResult = 0;
            for (int i = start; i <= end; i++) {
                sumResult += i;
            }
            return sumResult;
        } else {
            //大于一百时进行分割
            int middle = (end + start) / 2;
            SumTask leftSum = new SumTask(this.start, middle);
            SumTask rightSum = new SumTask(middle, this.end);
            leftSum.fork();
            rightSum.fork();
            return leftSum.join() + rightSum.join();
        }
    }

    public static void main(String[] args) {
        SumTask sumTask = new SumTask(1, 999999);
        sumTask.fork();
        System.out.print("result:" + sumTask.join());
    }
} 
默认线程数

默认线程池有固定的线程数,会根据可用的 availableProcessors 来计算线程数量。

/**
* Creates a {@code ForkJoinPool} with parallelism equal to {@link
* java.lang.Runtime#availableProcessors}, using the {@linkplain
* #defaultForkJoinWorkerThreadFactory default thread factory},
* no UncaughtExceptionHandler, and non-async LIFO processing mode.
*
* @throws SecurityException if a security manager exists and
*         the caller is not permitted to modify threads
*         because it does not hold {@link
*         java.lang.RuntimePermission}{@code ("modifyThread")}
*/
    public ForkJoinPool() {
        this(Math.min(MAX_CAP, Runtime.getRuntime().availableProcessors()),
             defaultForkJoinWorkerThreadFactory, null, false);
    }
自定义线程数

如果想使用自定义线程池,比如100个线程的线程池,可以如下:

public static void main(String[] args) {
        ForkJoinPool forkJoinPool=new ForkJoinPool(100);
        SumTask sumTask = new SumTask(1, 999999);
        forkJoinPool.submit(sumTask);
        System.out.print("result:" + sumTask.join());
    }

当然无论你初始化多少线程,都只会有和CPU数量相等的几个线程运行。

如果你是新手,这篇博客可能会对你有所帮助。博客的作者是B站黑马程序员的《python多线程编程》的视频的笔记摘录。博客中的代码是作者手动敲的,可以直接运行,如果有错误,作者欢迎评论指正。在博客中,有两个示例代码可以帮助你理解多线程的概念和使用方法。第一个示例是一个简单的多线程实现,其中一个线程用来唱歌,另一个线程用来跳舞。在示例代码中,使用了`threading.Thread`来创建两个线程,并分别指定了目标函和参。然后通过`start`方法启动线程。这样,两个线程就可以并发地执行唱歌和跳舞的任务。第二个示例代码展示了线程之间执行的顺序。在这个示例中,使用了`threading.current_thread`来获取当前线程线程对象,并打印出来。然后通过循环创建了5个子线程,并启动它们。由于多线程的执行是并发的,所以无法确定线程的执行顺序。希望这些示例代码对你理解和学习python多线程编程有所帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Python多线程编程(详细:适合小白入门)](https://blog.csdn.net/weixin_44917390/article/details/119610760)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腹黑的乌鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值