当前位置: 首页 > news >正文

【Java面试】创建线程有哪几种方式

目录

1.继承Thread类

2.实现Runnable接口

3.实现Callable接口和FutureTask

 4.使用Executor框架(线程池)

Java并发编程中不同接口和类之间的关系

总结


1.继承Thread类

优点:

  • 简单直观。
  • 直接继承Thread类,可以方便地使用Thread类的方法。

缺点:

  • Java不支持多继承,因此如果你的类已经继承了别的类,那么就不能再继承Thread类。
  • 仅适用于简单的线程任务。

示例:

class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}

2.实现Runnable接口

优点:

  • 解决了单继承的问题,可以同时实现多个接口。

缺点:

  • 需要通过 ​​Thread​​ 类的构造器来创建线程对象。

示例: 

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable is running");
    }

    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}

3.实现Callable接口和FutureTask

优点:

  • Callable接口的call()方法可以返回值和抛出异常(上面两种方法只能在函数内部try catch)。
  • 通过FutureTask可以获取任务的执行结果。 

 缺点:

  • 相对复杂,适合需要返回结果的任务。

示例:

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        return 42;
    }

    public static void main(String[] args) throws Exception {
        FutureTask<Integer> futureTask = new FutureTask<>(new MyCallable());
        Thread thread = new Thread(futureTask);
        thread.start();
        System.out.println("Result: " + futureTask.get());
    }
}

 4.使用Executor框架(线程池)

优点:

  • 提供了更高级的线程管理和调度功能。
  • 适合大规模并发任务的管理。
  • 代码更简洁,可维护性更高。

缺点:

  • 学习成本大,需要了解Executor框架的各个组件。 

示例:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class MyRunnable implements Runnable {
    @Override
    public void run() {
        System.out.println("Runnable is running in Executor");
    }

    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {
            executor.submit(new MyRunnable());
        }
        executor.shutdown();
    }
}

Java并发编程中不同接口和类之间的关系

  • MyCall实现了Callable<V>,定义了任务的具体行为。

  • FutureTask实现了RunnableFuture,可以被线程执行,并且可以获取结果。

  • FutureTask被传递给Thread作为目标,线程执行这个任务。

  • 任务完成后,可以通过FutureTaskget()方法获取结果。

总结

  • 继承 Thread​ 类:简单直观,适合初学者。
  • 实现 Runnable​ 接口:灵活,解决单继承问题。
  • 实现 Callable​ 接口和 ​FutureTask​​:适合需要返回结果的任务。
  • 使用 Executor​ 框架:适合大规模并发任务的管理,提供高级功能。

推荐使用 ​​Executor​​ 框架,因为它提供了更强大的功能和更好的性能。

相关文章:

  • 西安大型网站设计公司郑州网络推广效果
  • 大良商城网站建设百度知道app官方下载
  • 蜜芽加密通道入口2021南宁seo平台标准
  • 推广网站怎么做知乎营销的三个基本概念是什么
  • 做美食有哪些网站百度关键词搜索量排名
  • 怎么在百度上面做网站百度seo优化公司
  • An Efficient Anti-Interference Imaging Technology for Marine Radar 论文阅读
  • 第6篇:面向对象编程重构系统
  • 常见的消息中间件以及应用场景
  • 【微知】git 如何修改某个tag名字?如何根据某个commit创建一个tag?
  • SQL 中UPDATE 和 DELETE 语句的深入理解与应用
  • 常见深度学习算法图解笔记
  • 【MySQL】窗口函数详解(概念+练习+实战)
  • 避免 Git 文件名大小写出错
  • 哈工大 计算机组成原理 第三章计算机总线 笔记
  • 磁盘阵列新秀GSx并行文件存储是HPC高性能计算/AI 大模型-1替3好省预算
  • next.js-学习5
  • JSON(JavaScript Object Notation)
  • 图形学曲线c++简单实现
  • Vllm进行Qwen2-vl部署(包含单卡多卡部署及爬虫请求)
  • mysqldump 参数详解
  • Linux | 程序 / 进程调用库依赖关系查看
  • 上位机知识篇---HTTPHTTPS等各种通信协议
  • 网络空间安全(4)web应用程序安全要点
  • STL 算法库中的 min_element 和 max_element
  • 什么是HTTP协议