美文网首页
创建线程的几种主流方式

创建线程的几种主流方式

作者: zy_think123 | 来源:发表于2021-01-21 23:46 被阅读0次

继承Thread类

继承Thread类,并重写它的run方法,就可以创建一个线程了,当然线程是如何真正被启动,可以参考我之前的 为什么start方法才能启动线程,而run不行?

class ThinkThread extends Thread {
  @Override
  public void run() {
      System.out.println("think123");
  }
}

new ThinkThread().start();

实现Runnable接口

 new Thread(() -> 
  System.out.println("实现了Runnable接口")
).start();

构造Thread时传入Runnable类型的参数,也可以创建一个线程

通过线程池创建线程

// 提交 Runnable 任务
Future<?> submit(Runnable task);

// 提交 Callable 任务
<T> Future<T> submit(Callable<T> task);

// 提交 Runnable 任务及结果引用。 future.get()==result
<T> Future<T> submit(Runnable task, T result);

Runnable类型的参数和Callable类型的参数不同之处在于Runnable 接口的 run() 方法是没有返回值的,所以 submit(Runnable task)这个方法返回的 Future 仅可以用来断言任务已经结束了,类似于 Thread.join()。 而Callable是一个接口,它有一个call()方法,这个方法是有返回值的,这个可以通过 future.get() l获取任务执行结果

// 建议手动创建线程池,这里只是为了举例
ExecutorService service = Executors.newFixedThreadPool(1);

Future future = service.submit(() -> "think123");

System.out.println(future.get());

通过FutureTask创建线程

FutureTask继承了Runnable和Future接口,所以我们可以将FutureTask对象作为任务提交到线程池执行,也可以直接被Thread执行,而且还可以获取到任务执行结果。

FutureTask task = new FutureTask(() -> "666");

Thread t1 = new Thread(task);
t1.start();;

// 阻塞main线程,直到t1执行完成
System.out.println(task.get());

FutureTask的源码很简单,当执行run方法时,会将执行的结果保存在内部变量 outcome 中,即便是抛出了异常,此时也会将异常记录到outcome中。

当调用 get 方法时,如果还未执行完成,则会阻塞调用方。执行完成后会将正常的结果返回,如果call方法中抛出了异常,则将其封装成 ExecutionException 抛出。

总结

上面介绍了Java中常用的创建线程执行的方式,可以发现,实际上都是通过 创建Thread来执行的,实际上也是可以算作一种,如果面试官问题,你可以先装一下说之后一种,然后峰回路转,给他说说为什么之后一种。

当然还有其他方式,比如TimerTask, Quartz Job但是实际上都是类似的。

相关文章

  • 创建线程的几种主流方式

    继承Thread类 继承Thread类,并重写它的run方法,就可以创建一个线程了,当然线程是如何真正被启动,可以...

  • 线程

    java 中创建线程有哪几种方式? Java中创建线程主要有三种方式: 一、继承Thread类创建线程类 (1)定...

  • 创建线程几种方式

    1、继承Thread类 2、实现Runnable接口 推荐:可实现多个接口,而只能继承一个类。 3、应用程序可以使...

  • 【Android】app卡顿监控的技术原理

    目前业界主流的几种有效的监控方式如下: 子线程不断轮询主线程。 Looper Printer Choreograp...

  • Future系列(FutureTask)

    一、前言 创建线程有几种方式? 继承 Thread 类 实现 Runnable 接口 但这两种方式创建的线程是属于...

  • Java多线程:线程的创建与启动

    # 面试题: Java中创建线程有几种方式。 不同的创建方式有什么区别。 如何启动一个线程。 # Java中创建线...

  • 线程的几种创建方式

    线程的几种创建方式 编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Threa...

  • 创建线程的几种方式

    说道线程,肯定会想到使用 java.lang.Thread.java这个类那么创建线程也主要有2种方式第一种方式:...

  • 几种创建线程的方式

    继承Thread 通过继承Thread类来创建并启动多线程的一般步骤如下1】d定义Thread类的子类,并重写该类...

  • 创建线程的几种方式

    1.通过继承Thread类创建线程类 1.步骤 定义Thread类的子类FirstThread,并重写run()方...

网友评论

      本文标题:创建线程的几种主流方式

      本文链接:https://www.haomeiwen.com/subject/qxbjzktx.html