【Java面试题-基础知识03】Java线程连环问
1、Java中的线程是什么?
在Java中,线程是程序执行流的最小单元。每个Java程序都至少有一个主线程,也称为主执行线程,它是程序开始执行时自动创建的。除了主线程外,程序员还可以创建额外的线程来执行并发任务。
2、创建线程的方式有哪些?
Java中的线程由java.lang.Thread类表示,可以通过两种方式创建线程:
继承Thread类:创建一个类并继承Thread类,在该类中重写run()方法,并在其中定义线程执行的任务。然后通过创建该类的对象并调用start()方法来启动线程。
class MyThread extends Thread {
public void run() {
// 线程执行的任务
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 启动线程
}
}
实现Runnable接口:创建一个类实现Runnable接口,在该类中实现run()方法,并在其中定义线程执行的任务。然后通过创建该类的对象,并将其传递给Thread类的构造函数来创建线程,最后调用start()方法启动线程。
class MyRunnable implements Runnable {
public void run() {
// 线程执行的任务
}
}
public class Main {
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start(); // 启动线程
}
}
3、上述两种方式的优缺点?
继承 Thread 类:
优点:
简单直观:直接继承 Thread 类,重写 run() 方法,代码比较简单,易于理解。
缺点:
类型局限性:Java是单继承的语言,如果已经继承了其他类,则无法再继承 Thread 类,限制了类的扩展性。
不利于共享资源:由于线程类已经继承了 Thread,无法再继承其他类,因此不利于多个线程之间共享资源。
实现 Runnable 接口:
优点:
避免单继承局限性:通过实现 Runnable 接口,可以避免单继承的限制,允许类继续继承其他类。
支持共享资源:由于不是继承线程类,因此可以将多个线程共享的资源放在实现 Runnable 接口的类中,更容易实现资源共享。
缺点:
略微复杂:相比于继承 Thread 类,实现 Runnable 接口稍微复杂一些,需要创建一个实现 Runnable 接口的类,并将其传递给 Thread 类。
一般情况下推荐使用实现 Runnable 接口的方式创建线程,因为它更灵活,可以避免单继承的限制,同时支持共享资源,更符合面向对象设计的原则。
4、什么是Java线程池?
Java线程池是一种用于管理和复用线程的机制,它可以在执行大量异步任务时提供性能的提升。使用线程池可以避免不断创建和销毁线程所带来的性能开销,并能更好地控制资源的使用情况。
5、如何创建Java线程池?
在 Java 中创建线程池通常通过 java.util.concurrent.Executors 类中的静态工厂方法来实现。
创建固定大小的线程池:
// 创建固定大小为 5 的线程池
ExecutorService executor = Executors.newFixedThreadPool(5);
创建单线程的线程池:
ExecutorService executor = Executors.newSingleThreadExecutor();
创建可缓存的线程池:
// 创建可缓存的线程池,线程数会根据需要自动增加或减少
ExecutorService executor = Executors.newCachedThreadPool();
创建定时执行任务的线程池:
// 创建定时执行任务的线程池,参数为核心线程数
ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
6、你用到过线程池的哪些参数?
线程池的参数通常取决于你在创建线程池时选择的具体实现和配置。一般来说,线程池的参数可以包括以下几个方面:
a. 核心线程数(Core Pool Size):这是线程池中的基本线程数量,即使它们处于空闲状态也会保持活动状态。当有新任务提交时,线程池会优先使用核心线程来执行任务。
b. 最大线程数(Maximum Pool Size):这是线程池中允许的最大线程数量。如果核心线程已经全部被占用,而且任务队列也已满,那么新任务就会创建额外的线程,直到达到最大线程数为止。超出最大线程数的任务将根据线程池的策略被拒绝执行。
c. 任务队列(Task Queue):任务队列用于存储提交但尚未执行的任务。当所有核心线程都处于忙碌状态时,新任务将被放置在任务队列中等待执行。任务队列的类型可以是有界队列,如`ArrayBlockingQueue`,也可以是无界队列,如`LinkedBlockingQueue`。
d. 线程存活时间(Keep Alive Time):当线程池中的线程数量超过核心线程数时,多余的空闲线程在经过一定时间后会被终止并从线程池中移除,以减少资源消耗。这个时间段即为线程的存活时间。
e. 拒绝策略(Rejected Execution Policy):当任务无法被线程池执行时的处理策略。常见的策略包括抛出异常、丢弃任务、丢弃最旧的任务、或者由调用线程执行任务等。
这些是线程池中常见的参数,你可以根据具体的需求来配置线程池以达到最佳的性能和资源利用率。

【Java面试题-基础知识03】Java线程连环问的更多相关文章
- Java面试题-基础知识
参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...
- 漫漫Java路1—基础知识—初涉java
前言 主学信息安全,在编程的路上还是一个孩子,还在一步一步探索,有些东西可能是站在自己的位置思考的,很可能会出现一些啼笑皆非的错误,如果有误,还希望各位斧正. Java安装 jdk的安装 甲骨文官网选 ...
- Java面试题基础知识(收集)
1.集合类:list和Set比较,各自的子类比较(Arraylist,Vector,inkedLIst,HashSet,TreeSet) List:存入元素有序,元素可以重复,允许null值得存在,主 ...
- Java并发(基础知识)—— Java中断机制
上文讲解了Java线程的创建.启动以及停止,在讲到停止线程时说到了Java中断,Java中断是停止线程的一种协作机制,本文打算对Java中断机制进行详细讲解. 在网上搜索Java中断机制,发现两篇好文 ...
- 【JAVA】【基础知识】Java程序执行过程
1. Java程序制作过程 使用文本编辑器进行编辑 2. 编译源文件,生成class文件(字节码文件) javac源文件路径. 3.运行程序class文件.
- 【Java面试】基础知识篇
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...
- Java并发(基础知识)—— Executor框架及线程池
在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有 ...
- Java面试题必备知识之ThreadLocal
老套路,先列举下关于ThreadLocal常见的疑问,希望可以通过这篇学习笔记来解决这几个问题: ThreadLocal是用来解决什么问题的? 如何使用ThreadLocal? ThreadLocal ...
- Java多线程系列--“基础篇”05之 线程等待与唤醒
概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...
- Java多线程系列--“基础篇”06之 线程让步
概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...
随机推荐
- 【产品动态】一文详细解读智能数据构建产品Dataphin的“规划”功能
简介: 数据中台是传统的数据仓库的一种升级, 是数据采集.建设.管理与使用的一整套体系,Dataphin是一个构建数据中台的强大工具, 核心优势是在数据的建设与管理上引入了阿里巴巴多年来数据中台建设 ...
- [FAQ] 为什么部署到 github pages 时自定义域名总失效 (push-dir)
Github_Pages 能方便我们部署静态页面,并且还支持 CNAME 自定义域名. $ yarn add --dev push-dir $ xxx build $ push-dir --dir=d ...
- [Go] Colly 使用 POST 提交 application/x-www-form-urlencoded 示范
Colly 提供了 Post 和 PostRaw 方法,它们的参数类型不一样,需要注意. 目标地址接受指定的 Content-Type,可以通过设置 request Header. 局部代码: // ...
- [FE] Chrome Extension 五步曲
1. Create the manifest.jsonOnly three fields is needed. { "name": "Getting Started Ex ...
- 特权同学笔记-《边练边学》-在QP里调用modelsim的步骤
在QP里调用Modelsim需要先设置仿真参数和工具路径. 在QP调用modelsim的步骤 1. 在QP里建立工程,代码,分析综合:2. 添加testbench代码,processing-start ...
- SuperSonic简介
SuperSonic融合ChatBI和HeadlessBI打造新一代的数据分析平台.通过SuperSonic的问答对话界面,用户能够使用自然语言查询数据,系统会选择合适的可视化图表呈现结果. Supe ...
- Oracle中ALTER TABLE的五种用法(三)
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- leaflet常用插件汇总介绍
1.Leaflet Ant Path(线条流动效果) 在交通项目.管网应用的项目中,常常需要标注出道路的走向.河流的流向或者管线的流向等等,Leaflet Ant Path能够很好的解决这类问题: g ...
- JDK源码阅读-------自学笔记(十二)(java.lang.StringBuffer和StringBuilder比较)
StringBuilder结构
- Laravel框架中数据库分表时Model使用方法
前言: 0.最近在使用laravel框架做MySQL分表的时候经过实践和踩坑,总结了以下3种可行的分表方法,亲测可用. 1.本人公司做的是SaaS系统,以店铺为维度.店铺id(shop_id) 命名规 ...