详解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的ConcurrentHashMap原理深入分析

    Java的ConcurrentHashMap原理深入分析

    这篇文章主要介绍了Java的ConcurrentHashMap原理深入分析,集合是编程中最常用的数据结构,而谈到并发,几乎总是离不开集合这类高级数据结构的支持,需要的朋友可以参考下
    2023-07-07
  • SpringBoot3整合Nacos V2.3.2的详细过程

    SpringBoot3整合Nacos V2.3.2的详细过程

    本文介绍了如何在 Spring Boot 3.2.x 项目中整合 Nacos 2.3.2,包括依赖配置、Nacos 服务发现与动态配置的配置方法,通过整合 Nacos,Spring Boot 应用可以实现高效的服务发现、动态配置管理以及分布式系统中的灵活扩展,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • java7改善后的异常处理

    java7改善后的异常处理

    在本篇文章里小编给大家整理的是关于java7改善后的异常处理知识点总结,有需要的朋友们参考下。
    2019-11-11
  • java编写冒泡排序的完整示例

    java编写冒泡排序的完整示例

    这篇文章主要给大家介绍了关于java编写冒泡排序的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Java怎么重命名 Amazon S3 中的文件和文件夹

    Java怎么重命名 Amazon S3 中的文件和文件夹

    在本文中,我们探讨了使用适用于 Java 的 AWS 开发工具包重命名 S3 存储桶中的文件和文件夹的方法,我们探索了两种不同的情况,它们使用相同的概念来重命名对象,用新名称复制它们并删除原始名称
    2023-10-10
  • idea +junit单元测试获取不到bean注入的解决方式

    idea +junit单元测试获取不到bean注入的解决方式

    这篇文章主要介绍了idea +junit单元测试获取不到bean注入的解决方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java之Spring Boot创建和使用

    Java之Spring Boot创建和使用

    Spring 的诞生就是为了简化 Java 程序的开发的.Spring Boot 的诞生就是为了简化 Spring 程序开发的,对Springboot感兴趣的同学可以借鉴本文
    2023-04-04
  • spring mvc 组合mybatis框架实例详解

    spring mvc 组合mybatis框架实例详解

    本项目采用 maven 结构,主要演示了 spring mvc + mybatis,controller 获取数据后以json 格式返回数据。对spring mvc 组合mybatis的方法感兴趣的朋友可以参考下本文
    2018-01-01
  • 关于Selenium的UI自动化测试屏幕截图功能实例代码

    关于Selenium的UI自动化测试屏幕截图功能实例代码

    今天小编就为大家分享一篇关于Selenium的UI自动化测试屏幕截图功能实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 详解如何为SpringBoot Web应用的日志方便追踪

    详解如何为SpringBoot Web应用的日志方便追踪

    在Web应用程序领域,有效的请求监控和可追溯性对于维护系统完整性和诊断问题至关重要,SpringBoot是一种用于构建Java应用程序的流行框架,在本文中,我们探讨了在SpringBoot中向日志添加唯一ID的重要性,需要的朋友可以参考下
    2023-11-11

最新评论