关于java:Java中创建线程的几种主流方式

3次阅读

共计 1416 个字符,预计需要花费 4 分钟才能阅读完成。

继承 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 来执行的,实际上也是能够算作一种,如果面试官问题,你能够先装一下说之后一种,而后峰回路转,给他说说为什么之后一种。

参考:《2020 最新 Java 根底精讲视频教程和学习路线!》
链接:https://juejin.cn/post/692024…

正文完
 0