赶紧收藏!2024 年最常见 100道 Java 基础面试题(二十二)

ops/2024/10/22 3:00:35/

上一篇地址:赶紧收藏!2024 年最常见 100道 Java 基础面试题(二十一)-CSDN博客

四十三、线程的run()和start()有什么区别?

在Java中,run()方法和start()方法都是与线程(Thread)相关的方法,但它们的作用和行为有所不同:

  1. run()方法

    • run()方法是java.lang.Runnable接口的一部分,用于定义线程要执行的具体任务。当线程被创建并启动后,run()方法中的代码将被执行。
    • 如果直接调用一个线程对象的run()方法,那么这个线程并不会在新线程中执行,而是在调用run()方法的当前线程中执行,即它不会产生多线程的效果。
    java">class MyThread implements Runnable {public void run() {// 线程执行的代码}
    }
    MyThread t = new MyThread();
    t.run(); // 直接调用run()方法,不会创建新线程
  2. start()方法

    • start()方法是java.lang.Thread类的方法,用于启动新线程。当调用一个线程对象的start()方法时,线程将进入可运行状态,Java虚拟机将会在适当的时候调度它的运行。
    • start()方法实际上会调用线程的run()方法,但在此之前,它会先执行与线程创建和初始化相关的操作。这意味着run()方法中的代码将在新线程的上下文中执行。
    java">Thread thread = new Thread(new MyRunnable());
    thread.start(); // 启动新线程,将会调用MyRunnable的run()方法
  3. 线程的生命周期

    • start()方法被调用时,线程的生命周期开始,线程会进入到就绪状态(Runnable),等待JVM调度其执行。
    • 当线程的run()方法执行完成后,线程结束其生命周期,进入到终止状态(Terminated)。
  4. 使用场景

    • 如果你想创建一个线程来执行特定的任务,你应该使用start()方法来启动线程。
    • 如果你只是想在当前线程中执行某个任务,而不需要创建新线程,你可以直接调用run()方法。

总结

  • run()方法是线程执行体,定义了线程要执行的任务。
  • start()方法是线程的启动器,调用它才会在新线程中执行run()方法。
  • 调用run()方法不会启动新线程,而start()方法会启动新线程并调用run()方法。
  • 在使用线程时,应该优先使用start()方法来启动线程,而不是直接调用run()方法。

四十四、创建线程池有哪几种方式?

在Java中,创建线程池主要有以下几种方式,每种方式都适用于不同的场景,并提供了不同级别的控制和灵活性:

  1. 使用ExecutorsExecutors类提供了一些工厂方法来创建不同类型的线程池,这些方法内部封装了线程池的创建细节。

    • 固定大小的线程池

    • java">ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
    • 单线程的线程池

      java">ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
    • 可缓存的线程池

      java">ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
    • 定时以及单次调度线程池

      java">ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);
  2. 使用ExecutorService接口的实现类: 直接创建java.util.concurrent包下ExecutorService接口的实现类的实例,如ThreadPoolExecutor

    java">int corePoolSize = 3;
    int maximumPoolSize = 10;
    long keepAliveTime = 1L;
    TimeUnit unit = TimeUnit.MINUTES;
    BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
    ThreadFactory threadFactory = Executors.defaultThreadFactory();
    RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
    ExecutorService threadPool = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory,handler
    );
  3. 使用ScheduledThreadPool: 如果需要执行定时任务或具有固定延迟的任务,可以使用ScheduledThreadPool

    java">ScheduledExecutorService scheduledThreadPool = new ScheduledThreadPoolExecutor(3);
  4. 自定义线程池: 如果标准线程池不能满足需求,可以自定义线程池。这涉及到继承ThreadPoolExecutor类或者实现Executor接口。

    java">class MyThreadPool extends ThreadPoolExecutor {public MyThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);}// 自定义线程池的其他行为
    }
    MyThreadPool myThreadPool = new MyThreadPool(3, 10, 1L, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>());
  5. 使用Executor接口: 直接实现Executor接口,提供一个执行任务的方法。

    java">class MyExecutor implements Executor {public void execute(Runnable command) {// 创建并启动新线程来执行任务}
    }
    MyExecutor myExecutor = new MyExecutor();

总结

  • Executors类提供了简便的方法来创建预定义配置的线程池,适合大多数一般用途。
  • ExecutorService接口和ThreadPoolExecutor类提供了更多的定制选项,适合需要特定行为的线程池。
  • ScheduledThreadPool适用于需要执行定时或周期性任务的场景。
  • 自定义线程池提供了最大的灵活性,但也需要更多的编码工作。
  • 选择哪种方式创建线程池,取决于具体的应用需求和对线程池行为的控制程度。

http://www.ppmy.cn/ops/27174.html

相关文章

iA Writer for Mac:简洁强大的写作软件

在追求高效写作的今天&#xff0c;iA Writer for Mac凭借其简洁而强大的功能&#xff0c;成为了许多作家、记者和学生的首选工具。这款专为Mac用户打造的写作软件&#xff0c;以其独特的设计理念和实用功能&#xff0c;助你轻松打造高质量的文章。 iA Writer for Mac v7.1.2中文…

Zapier 与生成式 AI 的自动化(三)

原文&#xff1a;zh.annas-archive.org/md5/057fe0c351c5365f1188d1f44806abda 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第九章&#xff1a;探索内置应用程序来提取和编译数据 正如我们在第六章中讨论的&#xff0c;创建多步 Zaps 和使用内置应用程序&#xff…

【笔试题汇总】华为春招笔试题解 2024-4-17

这里是paoxiaomo&#xff0c;一个现役ACMer&#xff0c;之后将会持续更新算法笔记系列以及笔试题题解系列 本文章面向想打ICPC/蓝桥杯/天梯赛等程序设计竞赛&#xff0c;以及各个大厂笔试的选手 感谢大家的订阅➕ 和 喜欢&#x1f497; 有什么想看的算法专题可以私信博主 &…

安装Kuboard管理k8s

一、Kuboard 介绍 Kuboard 是一款免费的 Kubernetes 管理工具,提供了丰富的功能,结合已有或新建的代码仓库、镜像仓库、CI/CD工具等,可以便捷的搭建一个生产可用的 Kubernetes 容器云平台,轻松管理和运行云原生应用。您也可以直接将 Kuboard 安装到现有的 Kubernetes 集群…

SSH远程登录实操实验!

ssh远程登录协议&#xff1a;默认端口号22 以下实验7-2是服务端&#xff0c;7-1是客户端 服务器的相关信息&#xff1a; 服务名称&#xff1a;sshd 服务端主程序&#xff1a;/usr/sbin/sshd 服务端配置文件&#xff1a;/etc/ssh/sshd_config 客户端相关信息&#xff1a; …

ChatGPT向付费用户推“记忆”功能,可记住用户喜好 | 最新快讯

4月30日消息&#xff0c;人工智能巨头OpenAI宣布&#xff0c;其开发的聊天机器人ChatGPT将在除欧洲和韩国以外的市场全面上线“记忆”功能。这使得聊天机器人能够“记住”ChatGPT Plus付费订阅用户的详细信息&#xff0c;从而提供更个性化的服务。 OpenAI早在今年2月就已经宣布…

【综述】多核处理器芯片

文章目录 前言 Infineon处理器 AURIX™系列 TC399XX-256F300S 典型应用 开发工具 参考资料 前言 见《【综述】DSP处理器芯片》 Infineon处理器 AURIX™系列&#xff0c;基于TriCore内核&#xff0c;用于汽车和工业领域。 XMC™系列&#xff0c;基于ARM Cortex-M内核&…

C++人工智能01C版本

这次新增了个游戏功能 看代码 #include"bits/stdc.h" #include"Windows.h" #define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0) using namespace std; bool memory[11]{false}; char z[1048576]{}; void calculator(char…