详解Java创建多线程的四种方式以及优缺点

 更新时间:2020年11月19日 16:43:23   作者:fking86  
这篇文章主要介绍了Java创建多线程的四种方式以及优缺点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

java有以下四种创建多线程的方式

1:继承Thread类创建线程

2:实现Runnable接口创建线程

3:使用Callable和FutureTask创建线程

4:使用线程池,例如用Executor框架创建线程

DEMO代码

package thread;
 
import java.util.concurrent.*;
 

public class ThreadTest {
 public static void main(String[] args) throws ExecutionException, InterruptedException {
//  创建线程的第一种方法
  Thread1 thread1 = new Thread1();
  thread1.start();
 
//  创建线程的第二种方法
  Thread2 thread2 = new Thread2();
  Thread thread = new Thread(thread2);
  thread.start();
 
//  创建线程的第三种方法
  Callable<String> callable = new Thread3();
  FutureTask<String> futureTask = new FutureTask<>(callable);
  Thread thread3 = new Thread(futureTask);
  thread3.start();
  String s = futureTask.get();
  System.out.println(s);
 
//  创建线程的第四种方法
  Executor executor = Executors.newFixedThreadPool(5);
  executor.execute(new Runnable() {
   @Override
   public void run() {
    System.out.println(Thread.currentThread()+"创建线程的第四种方法");
   }
  });
  ((ExecutorService) executor).shutdown();
 
 }
}
class Thread1 extends Thread{
 @Override
 public void run() {
  System.out.println(Thread.currentThread()+"创建线程的第一种方法");
 }
}
 
class Thread2 implements Runnable {
 
 @Override
 public void run() {
  System.out.println(Thread.currentThread()+"创建线程的第二种方法");
 }
}
 
class Thread3 implements Callable<String> {
 
 @Override
 public String call() throws Exception {
  return Thread.currentThread()+"创建线程的第三种方法";
 }
}

创建线程的三种方式的对比

1、采用实现Runnable、Callable接口的方式创建多线程

  优势:

   线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。

   在这种方式下,多个线程可以共享同一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而可以将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。

   劣势:

 编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法。

2、使用继承Thread类的方式创建多线程

  优势:

  编写简单,如果需要访问当前线程,则无需使用Thread.currentThread()方法,直接使用this即可获得当前线程。

  劣势:

  线程类已经继承了Thread类,所以不能再继承其他父类。

3、Runnable和Callable的区别

Runnable接口定义的run方法,Callable定义的是call方法。
run方法没有返回值,call方法必须有返回值。
run方法无法抛出异常,call方法可以抛出checked exception。
Callable和Runnable都可以应用于executors。而Thread类只支持Runnable.

总结

鉴于上面分析,因此一般推荐采用实现Runnable接口、Callable接口的方式来创建多线程。

到此这篇关于Java创建多线程的四种方式以及优缺点的文章就介绍到这了,更多相关Java创建多线程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 彻底理解Java中this 关键字

    彻底理解Java中this 关键字

    这篇文章主要介绍了彻底理解Java中this 关键字的相关资料,非常不错,具有参考价值,需要的朋友可以参考下
    2016-05-05
  • SpringBoot整合Mybatis与thymleft实现增删改查功能详解

    SpringBoot整合Mybatis与thymleft实现增删改查功能详解

    MybatisPlus是国产的第三方插件, 它封装了许多常用的CURDapi,免去了我们写mapper.xml的重复劳动。本文将整合MybatisPlus实现增删改查功能,感兴趣的可以了解一下
    2022-12-12
  • Java设计模式之观察者模式observer pattern详解

    Java设计模式之观察者模式observer pattern详解

    这篇文章主要介绍了Java设计模式之观察者模式observer pattern详解,当一个对象发生数据变化时,通知其他相关的一系列对象,接受到通知的对象根据该对象的变化进行相应处理以响应变化的过程,需要的朋友可以参考下
    2023-12-12
  • java 8 lambda表达式list操作分组、过滤、求和、最值、排序、去重代码详解

    java 8 lambda表达式list操作分组、过滤、求和、最值、排序、去重代码详解

    java8的lambda表达式提供了一些方便list操作的方法,主要涵盖分组、过滤、求和、最值、排序、去重,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • Java 实现分布式服务的调用链跟踪

    Java 实现分布式服务的调用链跟踪

    分布式服务中完成某一个业务动作,需要服务之间的相互协作才能完成,在这一次动作引起的多服务的联动我们需要用1个唯一标识关联起来,关联起来就是调用链的跟踪。本文介绍了Java 实现分布式服务的调用链跟踪的步骤
    2021-06-06
  • 浅析 ArrayList 和 LinkedList 有什么区别

    浅析 ArrayList 和 LinkedList 有什么区别

    ArrayList 和 LinkedList 有什么区别,是面试官非常喜欢问的一个问题。今天通过本文给大家详细介绍下,感兴趣的朋友跟随小编一起看看吧
    2020-10-10
  • Java数据结构之队列的简单定义与使用方法

    Java数据结构之队列的简单定义与使用方法

    这篇文章主要介绍了Java数据结构之队列的简单定义与使用方法,简单描述了队列的功能、特点,并结合java实例形式分析了队列的简单定义与使用方法,需要的朋友可以参考下
    2017-10-10
  • IDEA 报Plugin'maven-resources-plugin:'not found 的解决方案

    IDEA 报Plugin'maven-resources-plugin:'not found 

    如果在使用 IDEA 时遇到 "Plugin 'maven-resources-plugin:' not found" 错误,可能是由于 Maven 仓库中未找到所需的 Maven 插件,近小编给大家分享几种解决方法,感兴趣的朋友跟随小编一起看看吧
    2023-07-07
  • SpringAop实现原理及代理模式详解

    SpringAop实现原理及代理模式详解

    Spring的AOP就是通过动态代理实现的,使用了两个动态代理,分别是JDK的动态代理和CGLIB动态代理,本文重点给大家介绍下SpringAop实现原理及代理模式,感兴趣的朋友一起看看吧
    2022-04-04
  • Spring Boot实现第一次启动时自动初始化数据库流程详解

    Spring Boot实现第一次启动时自动初始化数据库流程详解

    在现在的后端开发中,只要是使用关系型数据库,相信SSM架构(Spring Boot + MyBatis)已经成为首选,本文就以Spring Boot + MyBatis为例,使用MySQL作为数据库,完成数据库初始化功能,文中有详细的代码示例,需要的朋友可以参考下
    2023-05-05

最新评论