Java多线程之四种实现方式

介绍
  1. 继承Thread类,并重写其run方法
  2. 实现Runnable接口
  3. 实现Callable接口通过FutureTask包装器来创建Thread线程
  4. 线程池,使用ExecutorService、Callable、Future实现有返回结果的多线程。

其中前两种方式线程执行完后都没有返回值,后两种是带返回值的。

方式一

继承Thread类创建线程,重写run方法,开启线程直接调用start方法,Thread类也是实现了Runnable接口

方式二

实现Runnable接口,然后作为参数去实例化一个Thread对象,调用start方法开启线程。Thread的start方法运行自己的run方法,而它的run方法是调用构造函数参数对象的run方法(如果参数对象存在)。

    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }
方式三

实现Callable接口通过FutureTask包装器来创建Thread线程,Callable接口和Runnable接口的差别,前者有返回值,而且会抛出检查型异常,后者无返回值,也不会抛出异常。

import java.util.concurrent.*;

public class ExecutorTest {
    public static void main(String[] args){
        Callable callable = new CallableDemo();
        FutureTask futureTask = new FutureTask(callable);
        new Thread(futureTask).start();
    }
}
class CallableDemo implements Callable{

    @Override
    public Object call() throws Exception {
        Thread.sleep(10000);
        return "OK";
    }
}
方式四

可返回值的任务必须实现Callable接口。类似的,无返回值的任务必须实现Runnable接口。FutureTask有一个构造函数,public FutureTask(Runnable runnable, V result),它可以把runnable接口和一个result对象包装成一个callable接口,内部采用适配器模式进行转换,从而runnable接口也能返回值。
执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable任务返回的Object了。
注意:get方法是阻塞的,即:线程无返回结果,get方法会一直等待。
再结合线程池接口ExecutorService就可以实现传说中有返回结果的多线程了。

import java.util.concurrent.*;

public class ExecutorTest {
    public static void main(String[] args){
        Callable callable = new CallableDemo();
        FutureTask futureTask = new FutureTask(callable);
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        Future future = executorService.submit(futureTask);
        executorService.shutdown();
        try {
            future.get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}
class CallableDemo implements Callable{

    @Override
    public Object call() throws Exception {
        Thread.sleep(10000);
        return "OK";
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值