首页 > 其他分享 >创建线程的三种方式:继承Thread、Runnable 接口、Callable 接口

创建线程的三种方式:继承Thread、Runnable 接口、Callable 接口

时间:2023-10-21 10:23:58浏览次数:39  
标签:Runnable run Thread 接口 Callable 线程

当在Java中创建线程时,有以下3种方法:
1. 通过实现Runnable接口:
这是Java中创建线程的推荐方式,因为它允许你分离线程的任务(run 方法)与线程的执行。以下是创建线程的步骤:

  • 创建一个实现Runnable接口的类,该接口包含一个run方法,这个方法将定义线程要执行的任务。
class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 线程要执行的任务
        System.out.println("线程执行了任务");
    }
}   

 

 

  • 创建一个Thread对象,将Runnable实例传递给它,并调用start方法启动线程。
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();

 

这会创建一个新的线程并执行run方法中定义的任务。
2. 通过继承Thread类:
这是另一种创建线程的方式,但通常不被推荐,因为它将线程的任务和线程本身耦合在一起。以下是创建线程的步骤:

  • 创建一个继承自Thread类的子类,并覆盖run方法,定义线程要执行的任务。
class MyThread extends Thread {
    @Override
    public void run() {
        // 线程要执行的任务
        System.out.println("线程执行了任务");
    }
}

 

  • 创建子类的实例,并调用start方法以启动线程。
MyThread myThread = new MyThread();
myThread.start();

 

这将创建一个新的线程并执行run方法中定义的任务。
无论你是选择实现Runnable接口还是继承Thread类,都需要明确指定线程要执行的任务,并在run方法中编写相应的代码。通常情况下,使用Runnable接口是更灵活和推荐的方式,因为它允许你将相同的任务传递给多个线程,而继承Thread类可能会导致类的单继承限制问题。

3.Callable 接口是 Java 中用于支持多线程编程的另一个关键接口。

Runnable 相比,Callable 具有一些附加功能,主要是它允许线程返回一个值或抛出异常。这对于需要获取线程执行结果或者处理可能抛出异常的任务非常有用。

  • Callable 接口: Callable 接口定义了一个名为 call 的方法,该方法在线程执行时返回一个结果或抛出异常。这个接口在 java.util.concurrent 包中定义。
public interface Callable<V> {
    V call() throws Exception;
}
  • Future 接口: 通常,当你使用 Callable 时,你会得到一个 Future 对象,它代表了异步计算的结果。Future 允许你在需要时获取线程的返回值,或者等待线程的执行完成。
public interface Future<V> {
    V get() throws InterruptedException, ExecutionException;
    // 其他方法
}

 

  • ExecutorService 为了执行 Callable 对象,通常会使用 ExecutorService 接口,它是线程池的一种实现。ExecutorService 允许你提交 Callable 任务并管理线程的执行。
public interface ExecutorService {
    <T> Future<T> submit(Callable<T> task);
    // 其他方法
}

 

使用 Callable 的主要优点包括:

  • 可以返回线程执行的结果,这在需要处理线程结果的情况下非常有用。
  • 可以抛出受检异常,允许更灵活地处理错误情况。
  • 可以使用 Future 对象跟踪线程的执行状态和结果。

此外,Java还提供了线程池的概念,可以更好地管理线程的生命周期和资源。

标签:Runnable,run,Thread,接口,Callable,线程
From: https://www.cnblogs.com/gentle-man/p/17778531.html

相关文章

  • celery包结构、celery延迟任务和定时任务、django中使用celery、接口缓存、双写一致性
    celery包结构project├──celery_task#celery包│├──__init__.py#包文件│├──celery.py#celery连接和配置相关文件,且名字必须叫celery.py│└──tasks.py#所有任务函数├──add_task.py#添加任务......
  • springdatajpa编写入门接口
    SDJ的一个牛逼的地方就是,它可以只编写JPA规范的接口,然后可以不用写实现类,然后,只要写了这个dao层接口,就可以实现最基本的CRUD操作,然而,要怎么实现JPA规范呢 写这个所谓的JPA规范接口,就是继承JpaRepository和JpaSpecificationExecutor两个接口说说第一个JR,就是它要放一个泛型,然......
  • 软件测试过程中如何有效的开展接口自动化测试
    一.简介接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中,通过对接口的自动化测试来提高测试效率和测试质量,减少人工测试的工作量和测试成本,并且能够快速发现和修复接口错误,确保软件系统的稳定性和可靠性。接口自动化测试......
  • java基础补习继承、抽象和接口
    之前java都是快速入手,很多的基础知识不牢固。没有系统学过。但是现在系统学也有点费时间,我就是碰到那些基础知识不懂或者不太明白时去找对应课程那一小节去学习那些知识。今天就小小学习了下java的继承、抽象还有接口等基础知识。 ......
  • 软件依赖管理-源码依赖、接口依赖、服务依赖
    在软件开发领域中,源码依赖、接口依赖和服务依赖是三种不同类型的依赖关系,它们有不同的特点和优缺点。下面我会详细解释它们的区别和各自的优缺点源码依赖(SourceCodeDependency)源码依赖是指一个软件项目依赖于其他软件项目的源代码。这通常发生在开源软件开发中,一个项目使用了......
  • -lpthread 和 pthread 以及 链接库的顺序
    写cmake文件时,编译一直无法正确识别欲调用的库函数,明明-lmysqlclient已经加上了。原本内容:(至今仍未解决,恳请各位点拨一下)cmake_minimum_required(VERSION3.0)project(HLWebServer)#设置C++标准为C++11set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS}-pthread-lmysqlclient......
  • 类和接口
    类和接口今日份学习final关键字和接口。final关键字凡是被final关键字修饰过的内容都是不可改变的。final变量final关键字可用于声明变量,一旦变量被设定,就不可以再改变该变量的值。通常,由final关键字定义的变量为常量。final关键字定义的变量必须在声明时对它进行赋值操作。它除了......
  • 2023年CANN训练营第二季——叭一叭几款AscendC算子支持芯片的运算单元以及AscendC提供
    前言:    我们知道昇腾AI芯片,有1个或多个AiCore,AiCore上有Cube和Vector运算单元提供给算子进行运算,有的AiCore是Cube和Vector一体的,有的Cube和Vector是分开,各自独立的。我们还记得例程中的例子一般都指定核心数BLOCK_DIM=8,这又是为什么,有啥道理呢?本文就来叭一叭,昇腾芯片的运......
  • 接口管理神器Apipost
    自诞生以来,Apipost凭借其简洁直观的用户界面、强大的功能以及简单、易上手的操作,让Apipost成为了开发人员不可或缺的工具。本文将详细介绍Apipost的主要功能和使用方法,帮助大家更好地了解这款优秀的API开发工具。下载安装直接进入Apipost官网下载即可,也可以直接使用web端无需下载AP......
  • 接口管理神器Apipost
    自诞生以来,Apipost凭借其简洁直观的用户界面、强大的功能以及简单、易上手的操作,让Apipost成为了开发人员不可或缺的工具。本文将详细介绍Apipost的主要功能和使用方法,帮助大家更好地了解这款优秀的API开发工具。下载安装直接进入Apipost官网下载即可,也可以直接使用web端无需下......