线程的四种创建方式

简介: 线程的四种创建方式

3 通过 ExecutorService 和 Callable<Class> 实现有返回值的线程

我们需要在主线程中开启多个线程去执行一个任务,然后收集各个线程的返回结果并将最终结果进行汇总,这是就需要用到 Callable 接口。

具体步骤:

(1)创建一个类实现Callable接口

(2)重写 call()  方法

调用步骤:

(1)创建线程池

(2)创建接收结果的列表集合

(3)创建线程对象

(4)将线程对象提交到线程池中,并将返回结果接收

(5)将返回结果加入结果集合

(6)关闭线程池

//通过实现Callable接口来创建线程类
public class CThread implements Callable<String> {
    private String name;
    public CThread(String name ) {
        this.name = name;
    }
    //重写call()方法
    @Override
    public String call() throws Exception {
        return name;
    }   
}
/***********************************************************************/
//调用线程
//创建线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
//创建接收结果的列表集合
List<Future> list = new ArrayList<Future>();
for(int i = 0;i<5;i++) {
//创建线程对象
Callable c = new CThread("线程"+i);
//将线程对象提交到线程池中,并将返回结果接收
Future future = pool.submit(c);
System.out.println("线程"+i+"已经加入线程池");
//将返回结果加入集合
list.add(future);
}
//关闭线程池
pool.shutdown();
//打印返回结果
for (Future future : list) {
    try {
        System.out.println(future.get().toString());
    } catch (InterruptedException | ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

4 基于线程池的execute(),创建临时线程

我们可以利用缓存策略使用线程池来创建线程

具体创建:

(1)创建线程池

(2)调用线程池的execute()方法

(3)采用匿名内部类的方法,创建Runnable对象,并重写run()方法

public class EThread {
    public static void main(String[] args) {
        //创建线程池
        ExecutorService threadPool = Executors.newFixedThreadPool(10);
        for(int i = 0;i<10;i++) {
            //调用execute()方法创建线程
            //采用匿名内部类的方法,创建Runnable对象,并重写run()方法
            threadPool.execute(new Runnable() {
                @Override
                public void run() {
                    System.out.println(Thread.currentThread().getName());   
                }
            });
        }
    }
}



相关文章
|
存储 弹性计算 NoSQL
libcuckoo论文概述
本文简要阐述libcuckoo项目的两篇论文基础。如有错漏之处,欢迎指出一起讨论交流。 ## 论文1 《MemC3: Compact and Concurrent MemCache with Dumber Caching and Smarter Hashing》 这篇论文主要讲了在多线程模式下如何提升cuckoo hash table的吞吐。 ### 问题 传统hash表在并发效率上并不
2156 0
libcuckoo论文概述
|
存储 内存技术
【核磁共振成像】临床基本通用脉冲序列(二)
【核磁共振成像】临床基本通用脉冲序列
|
9月前
|
机器学习/深度学习 JavaScript PyTorch
9个主流GAN损失函数的数学原理和Pytorch代码实现:从经典模型到现代变体
生成对抗网络(GAN)的训练效果高度依赖于损失函数的选择。本文介绍了经典GAN损失函数理论,并用PyTorch实现多种变体,包括原始GAN、LS-GAN、WGAN及WGAN-GP等。通过分析其原理与优劣,如LS-GAN提升训练稳定性、WGAN-GP改善图像质量,展示了不同场景下损失函数的设计思路。代码实现覆盖生成器与判别器的核心逻辑,为实际应用提供了重要参考。未来可探索组合优化与自适应设计以提升性能。
779 7
9个主流GAN损失函数的数学原理和Pytorch代码实现:从经典模型到现代变体
|
网络安全 Docker 容器
ptables failed: iptables --wait -t filter -A DOCKER 问题解决
ptables failed: iptables --wait -t filter -A DOCKER
ptables failed: iptables --wait -t filter -A DOCKER 问题解决
|
监控 Linux 数据处理
探索Linux中的`mountpoint`命令
`mountpoint`命令在Linux中用于检测目录是否为挂载点,关键在于检查`/etc/mtab`或`/proc/mounts`。简单易用,高效且无额外依赖。例如,用`mountpoint -q /mnt/data`判断挂载点,并结合`find`列出所有挂载点。在脚本中注意检查返回值,可能需`sudo`提升权限。可与其他命令组合以扩展功能。
365 10
|
Java 数据库 Spring
java读取配置文件数据
java读取配置文件数据
460 0
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
JavaScript 前端开发 Java
Java11 新特性深度解析
Java11 新特性深度解析
|
存储 分布式计算 Java
存算分离与计算向数据移动:深度解析与Java实现
【11月更文挑战第10天】随着大数据时代的到来,数据量的激增给传统的数据处理架构带来了巨大的挑战。传统的“存算一体”架构,即计算资源与存储资源紧密耦合,在处理海量数据时逐渐显露出其局限性。为了应对这些挑战,存算分离(Disaggregated Storage and Compute Architecture)和计算向数据移动(Compute Moves to Data)两种架构应运而生,成为大数据处理领域的热门技术。
460 2
|
Linux Shell Python
centos执行pip3 install etcd3报错
centos执行pip3 install etcd3报错