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线程连环问的更多相关文章

  1. Java面试题-基础知识

    参考文章:Java面试题-基础知识 基础能力 什么是值传递和引用传递 线程状态有哪些,它们之间是如何转换的 进程与线程的区别,进程间如何通讯,线程间如何通讯? HashMap的数据结构是什么?如何实现 ...

  2. 漫漫Java路1—基础知识—初涉java

    前言 主学信息安全,在编程的路上还是一个孩子,还在一步一步探索,有些东西可能是站在自己的位置思考的,很可能会出现一些啼笑皆非的错误,如果有误,还希望各位斧正. Java安装 jdk的安装 甲骨文官网选 ...

  3. Java面试题基础知识(收集)

    1.集合类:list和Set比较,各自的子类比较(Arraylist,Vector,inkedLIst,HashSet,TreeSet) List:存入元素有序,元素可以重复,允许null值得存在,主 ...

  4. Java并发(基础知识)—— Java中断机制

    上文讲解了Java线程的创建.启动以及停止,在讲到停止线程时说到了Java中断,Java中断是停止线程的一种协作机制,本文打算对Java中断机制进行详细讲解. 在网上搜索Java中断机制,发现两篇好文 ...

  5. 【JAVA】【基础知识】Java程序执行过程

    1. Java程序制作过程 使用文本编辑器进行编辑 2. 编译源文件,生成class文件(字节码文件) javac源文件路径. 3.运行程序class文件.

  6. 【Java面试】基础知识篇

    [Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.Ja ...

  7. Java并发(基础知识)—— Executor框架及线程池

    在Java并发(基础知识)—— 创建.运行以及停止一个线程中讲解了两种创建线程的方式:直接继承Thread类以及实现Runnable接口并赋给Thread,这两种创建线程的方式在线程比较少的时候是没有 ...

  8. Java面试题必备知识之ThreadLocal

    老套路,先列举下关于ThreadLocal常见的疑问,希望可以通过这篇学习笔记来解决这几个问题: ThreadLocal是用来解决什么问题的? 如何使用ThreadLocal? ThreadLocal ...

  9. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  10. Java多线程系列--“基础篇”06之 线程让步

    概要 本章,会对Thread中的线程让步方法yield()进行介绍.涉及到的内容包括:1. yield()介绍2. yield()示例3. yield() 与 wait()的比较 转载请注明出处:ht ...

随机推荐

  1. 【笔记】Oracle 窗口函数

    Oracle 窗口函数 简单来说,窗口函数是分析函数的一种,通常可以理解成over()函数 构成:函数名①() over(partition by 分组的列名 order by 排序的列名 XXX) ...

  2. 力扣2(java&python)-两数相加(中等)

    题目: 给你两个 非空 的链表,表示两个非负的整数.它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字. 请你将两个数相加,并以相同形式返回一个表示和的链表. 你可以假设除了数 ...

  3. 我们为什么要做 SoloPi

    SoloPi现状 去年(2019年)7月份,蚂蚁集团正式对外开源了客户端自动化测试工具 SoloPi ,其主要包括三大模块:录制回放(用于功能测试).性能工具(用于性能测试)以及一机多控(服务于兼容性 ...

  4. DDD as Code:如何用代码诠释领域驱动设计?

    简介: 相较于常规的MVC架构,DDD更抽象.更难以理解,各个开发者对DDD的解释也不尽相同.那么哪种设计方式才更好?在学习时如何知道哪种DDD更正统,没有被别人带歪?本文尝试使用"DDD ...

  5. 阿里云日志服务SLS,打造云原生时代智能运维

    ​2021年10月21日,阿里云针对企业运维难题,在云栖大会为大家带来了一场<智能运维论坛>的主题演讲.在会上,阿里云资深技术专家.日志服务技术负责人简志提出"云原生时代,企业业 ...

  6. [MongoDB] aggregate 查询的优化思路

    首先从业务角度出发,不必要的筛选条件和粗略的筛选条件会严重影响查询速度,比如 $or 查询和 $in 查询,视情况尽可能去掉. 程序中打印出查询条件的各部分,有 $match.$group.比如 PH ...

  7. [FAQ] golang-migrate/migrate error: default addr for network '127.0.0.1:3306' unknown

    按照项目github文档上所示,在使用 mysql 时你可能会这样写: $ migrate -path db/migrations -database mysql://root:123456@127. ...

  8. 11.prometheus监控之黑盒(blackbox)监控

    一.黑盒监控 "白盒监控"--需要把对应的Exporter程序安装到被监控的目标主机上,从而实现对主机各种资源及其状态的数据采集工作. 但是由于某些情况下操作技术或其他原因,不是所 ...

  9. vue项目(cli-3)替换浏览器logo

    思路: 根html文件的 <link rel="icon" href="<%= BASE_URL %>favicon.ico">是引入i ...

  10. 都2024年了,你还不知道git worktree么?

    三年前 python 大佬吉多·范罗苏姆(为 Python 程序设计语言的最初设计者及主要架构师)才知道 git worktree ,我现在才知道,我觉得没啥丢人的. 应用场景 如果你正在 featu ...