开启线程的第三种方法--实现Callable接口(子线程有返回值)

本文介绍了Java中实现多线程的Callable接口和FutureTask的使用。通过创建CallableImpl和CallableImpl2类实现Callable接口,每个类在call方法中进行循环打印。在测试类Test中,使用FutureTask包装Callable对象并启动线程,展示了如何获取子线程的返回值。文章强调了Callable与Runnable的区别,并指出FutureTask是Future接口的实现,用于获取子线程的返回结果。

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

前言

一个进程可以有多个进程完成,每个进程都有一个默认的进程main

每个进程都是由CPU进程调度的,每个进程之间每次都是进行抢占的,所以进程每次在进行时都具有随机性

一、实现Callable接口开启进程

Callable 接口和Runnable是差不多的,两个接口都是用于那些创建对象可能被另一个线程执行的类设计的。但是 Callable 接口有返回值,还可以抛出异常。Runnable则既没有返回值也不可以抛出异常 。

实现Runnable接口方法开启进程的步骤:
1.实现callable接口
2.创建类的测试类,创建对象,开启子线程

二、代码实现

新建两个类去实现两个子线程所实现的要求,利用一个测试类Test开启线程
##1.第一个类

/*
 *实现callable接口开启有返回值的子线程
 * @author 脱发的小白
 */
import java.util.concurrent.Callable;

public class CallableImpl implements Callable<Object> {

	@Override
	public Object call() throws Exception {
		// TODO Auto-generated method stub
		String name = Thread.currentThread().getName();//获取当前的进程名
		for(int i=0;i<10;i++) {
			System.out.println(name+"在打印"+i);
		}
		return 3847;//子线程返回值--自动装箱,变成包装类
	}
}

##2.第二个类

/*
 *实现callable接口开启有返回值的子线程
 * @author 脱发的小白
 */
import java.util.concurrent.Callable;

public class CallableImpl2 implements Callable<Object> {

	@Override
	public Object call() throws Exception {
		// TODO Auto-generated method stub
		String name = Thread.currentThread().getName();//获取当前的进程名
		for(int i=0;i<10;i++) {
			System.out.println(name+"在打印"+i);
		}
		return 3847;//自动装箱,变成包装类
	}
}

##3.测试类

/*
 *实现callable接口开启有返回值的子线程
 * @author 脱发的小白
 */
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class Test {
	public static void main(String[] args) throws InterruptedException, ExecutionException {
     CallableImpl callableImpl = new CallableImpl();
     //FutureTask 类是 Futur接口 的一个实现,FutureTask 实现 Runnable接口
     FutureTask<Object> futureTask = new FutureTask<>(callableImpl);//创建FutureTask的对象
     Thread thread = new Thread(futureTask);//FutureTask实现了Runnable接口,多态
     thread.start();//开启子线程
     
     //获取子线程1的返回值
     Object object = futureTask.get();//抛出异常
     System.out.println(object);
    
     //开启第二个类的子线程
     CallableImpl2 callableImpl2 = new CallableImpl2();
     FutureTask<Object> futureTask2 = new FutureTask<>(callableImpl2);
     Thread thread2 = new Thread(futureTask2);//FutureTask实现了Runnable接口,多态
     thread2.start();
	}

}

##4.运行结果显示
在这里插入图片描述

总结

  1. Callable 接口和Runnable都是用于那些创建出来的类用于子线程执行的类
  2. Callable 既有返回值又可以抛出异常
  3. FutureTask 类是 Futur接口 的一个实现,FutureTask 实现 Runnable接口
  4. 获取子线程的返回值要使用实现了Runnable接口的FutureTesk的对象
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值