java.util.concurrent多线程并行处理返回处理结果(计算一个list集合)

本文介绍了如何使用Java的CompletionService结合Executor和BlockingQueue来处理并发计算任务,强调了Callable任务的优势以及CompletionService如何避免内存溢出和提高效率。通过示例代码展示了如何对list集合进行多线程并行计算并获取结果。
摘要由CSDN通过智能技术生成

java.util.concurrent多线程并行处理返回处理结果(计算一个list集合)

普通情况下,我们使用Runnable作为主要的任务表示形式,可是Runnable是一种有非常大局限的抽象,run方法中仅仅能记录日志,打印,或者把数据汇总入某个容器(一方面内存消耗大,还有一方面须要控制同步,效率非常大的限制),总之不能返回运行的结果;
比方同一时候1000个任务去网络上抓取数据,然后将抓取到的数据进行处理(处理方式不定),
最好的方式就是提供回调接口,把处理的方式最为回调传进去;
可是如今我们有了更好的方式实现:CompletionService + Callable
CompletionService将Executor(线程池)和BlockingQueue(堵塞队列)结合在一起,同一时候使用Callable作为任务的基本单元,整个过程就是生产者不断把Callable任务放入堵塞对了,Executor作为消费者不断把任务取出来运行,并返回结果;
优势:
a、堵塞队列防止了内存中排队等待的任务过多,造成内存溢出(毕竟一般生产者速度比較快,比方爬虫准备好网址和规则,就去运行了,运行起来(消费者)还是比較慢的)
b、CompletionService能够实现,哪个任务先运行完毕就返回,而不是按顺序返回,这样能够极大的提升效率

以下代码实现list集合分发多线程串行计算返回计算结果

package com.project.service.service.impl;
import com.google.common.collect.Lists;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
import java.util.concurrent.*;
public class Test {
   


    /**
     * 多线程并发遍历list源数据
     * 将每个线程处理结果返回
     * @param args
     * @throws Exception
     */
    public static void main (String[]args) throws Exception{
   
        //创建操作源数据 list集合
        List list = Lists.newArrayList();
        for(int i =1;i<=21;i++){
   
            Student student=new St
以下是Java代码示例,演示如何使用Minio Java客户端库实现将一个文件流使用多线程上传到Minio: ```java import io.minio.MinioClient; import io.minio.errors.MinioException; import java.io.FileInputStream; import java.io.InputStream; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class MultiThreadedStreamUploader { private static final String MINIO_ENDPOINT = "https://example.com"; private static final String ACCESS_KEY = "access_key_here"; private static final String SECRET_KEY = "secret_key_here"; private static final String BUCKET_NAME = "bucket_name_here"; private static final int BUFFER_SIZE = 1024 * 1024; // 1 MB public static void main(String[] args) throws Exception { // Initialize Minio client MinioClient minioClient = new MinioClient(MINIO_ENDPOINT, ACCESS_KEY, SECRET_KEY); // Create a new bucket if it doesn't already exist if (!minioClient.bucketExists(BUCKET_NAME)) { minioClient.makeBucket(BUCKET_NAME); } // Upload a file stream using multiple threads ExecutorService executorService = Executors.newFixedThreadPool(5); InputStream inputStream = new FileInputStream("/path/to/local/file"); long fileSize = inputStream.available(); for (int i = 0; i < 5; i++) { final int threadNumber = i; executorService.submit(() -> { try { long start = threadNumber * fileSize / 5; long end = (threadNumber + 1) * fileSize / 5 - 1; byte[] buffer = new byte[BUFFER_SIZE]; inputStream.skip(start); long bytesRead = 0; while (bytesRead < end - start + 1) { long bytesToRead = Math.min(buffer.length, end - start + 1 - bytesRead); int n = inputStream.read(buffer, 0, (int) bytesToRead); if (n == -1) { break; } bytesRead += n; minioClient.putObject(BUCKET_NAME, "file", new ByteArrayInputStream(buffer, 0, n), null); } System.out.println("Thread " + threadNumber + " finished uploading"); } catch (MinioException | IOException e) { e.printStackTrace(); } }); } // Shutdown the executor service executorService.shutdown(); executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); // List all objects in the bucket Iterable<Item> objects = minioClient.listObjects(BUCKET_NAME); for (Item object : objects) { System.out.println(object.objectName()); } } } ``` 在此示例中,我们使用Minio Java客户端库初始化了一个Minio客户端,并使用`makeBucket`方法创建了一个新的存储桶。然后,我们使用多个线程上传了一个文件流。使用`putObject`方法上传文件。在此示例中,我们使用5个线程并行上传文件流。最后,我们使用`listObjects`方法列出了桶中的所有对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值