java多线程带返回值_JAVA多线程实现的三种方式和带返回值实现

本文详细介绍了Java中实现多线程的四种方式,包括继承Thread类、实现Runnable接口、使用Callable接口结合FutureTask以及利用ExecutorService、Callable和Future。重点讨论了如何在多线程中实现返回值,特别是通过Future获取Callable任务的返回结果,并提供了示例代码进行演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、JAVA多线程实现的四种方式

继承Thread类

实现Runnable接口

实现Callable接口通过FutureTask包装器来创建Thread线程

使用ExecutorService、Callable、Future实现有返回结果的多线程

2、继承Thread类创建线程

Thread类本质上是实现了Runnable接口的一个实例

代表一个线程的实例

启动线程的唯一方法就是通过Thread类的start()实例方法

start()方法是一个native方法,它将启动一个新线程,并执行run()方法

3、实现Runnable接口创建线程

实现Runnable接口

继承 Thread 有弊端,java是单继承的

b34cc55a60dd9888f7fcdf0160522909.png

启动MyThread,需要首先实例化一个Thread,并传入自己的MyThread实例

2beb115ab252608d7d1cf3dc92c3277d.png

4、实现Callable接口通过FutureTask包装器来创建Thread线程

Callable接口(也只有一个方法)定义如下:

9f757394b26cfec06142aed4b850840d.png

用法如下:

97de063e7a83bd55afbaa0d00e18f3af.png

dddd17acb648cabe335facd5e33bfdbe.png

5、使用ExecutorService、Callable、Future实现有返回结果的线程

可返回值的任务必须实现Callable接口

无返回值的任务必须实现Runnable接口

执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object

注意:get方法是阻塞的,即:线程无返回结果,get方法会一直等待

/**

* 有返回值的线程

*/

@SuppressWarnings("unchecked")

public class Test {

public static void main(String[] args) throws ExecutionException,

InterruptedException {

System.out.println("----程序开始运行----");

Date date1 = new Date();

int taskSize = 5;

// 创建一个线程池

ExecutorService pool = Executors.newFixedThreadPool(taskSize);

// 创建多个有返回值的任务

List list = new ArrayList();

for (int i = 0; i < taskSize; i++) {

Callable c = new MyCallable(i + " ");

// 执行任务并获取Future对象

Future f = pool.submit(c);

// System.out.println(">>>" + f.get().toString());

list.add(f);

}

// 关闭线程池

pool.shutdown();

// 获取所有并发任务的运行结果

for (Future f : list) {

// 从Future对象上获取任务的返回值,并输出到控制台

System.out.println(">>>" + f.get().toString());

}

Date date2 = new Date();

System.out.println("----程序结束运行----,程序运行时间【"

+ (date2.getTime() - date1.getTime()) + "毫秒】");

}

}

class MyCallable implements Callable {

private String taskNum;

MyCallable(String taskNum) {

this.taskNum = taskNum;

}

public Object call() throws Exception {

System.out.println(">>>" + taskNum + "任务启动");

Date dateTmp1 = new Date();

Thread.sleep(1000);

Date dateTmp2 = new Date();

long time = dateTmp2.getTime() - dateTmp1.getTime();

System.out.println(">>>" + taskNum + "任务终止");

return taskNum + "任务返回运行结果,当前任务时间【" + time + "毫秒】";

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值