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. 实际项目中一般使用到的git知识

    1.项目上线分支管理流程 图片压缩太厉害有些模糊 700k 压缩到20多k 清晰些的图片地址https://project.zdzspace.cn/test-vuekey 2.一些常用的git命令 g ...

  2. Hologres揭秘:高性能原生加速MaxCompute核心原理

    简介: Hologres技术揭秘系列持续更新中,本期我们将带来Hologres高性能原生加速查询MaxCompute的技术原理解析. Hologres(中文名交互式分析)是阿里云自研的一站式实时数仓, ...

  3. [FAQ] MEMORY ALLOC FAILED: mmap with HUGETLB failed, attempting without it (you should fix your kernel)

    cat /proc/meminfo | grep Huge sysctl vm.nr_hugepages=128 cat /proc/meminfo | grep Huge Link:https:// ...

  4. dotnet SemanticKernel 入门 注入日志

    使用 SemanticKernel 框架在对接 AI 时,由于使用到了大量的魔法,需要有日志的帮助才好更方便定位问题,本文将告诉大家如何在 SemanticKernel 注入日志 本文属于 Seman ...

  5. dotnet 6 使用 Obfuscar 进行代码混淆

    本文来安利大家 Obfuscar 这个好用的基于 MIT 协议开源的混淆工具.这是一个非常老牌的混淆工具,从 2014 年就对外分发,如今已有累计 495.5K 的 nuget 下载量.而且此工具也在 ...

  6. 他又来了,.net开源智能家居之小米米家的c#原生sdk【MiHome.Net】1.0.0发布,快来打造你的私人智能家居吧

    背景介绍 hi 大家好,我是三合,作为一个非著名懒人,智能家居简直刚需,在上一篇文章他来了他来了,.net开源智能家居之苹果HomeKit的c#原生sdk[Homekit.Net]1.0.0发布,快来 ...

  7. Codeforces Round 932 (Div. 2) ABCD

    A. Entertainment in MAC 题意:给定字符串 \(S\),有两种操作,每次操作其中之一: 把 \(S\) 变为 \(S\) 的翻转 \(T\). 把 \(S\) 变为 \(S + ...

  8. 随机化Tricks

    参阅: https://zh.cppreference.com/w/cpp/numeric/random https://zh.cppreference.com/w/cpp/header/random ...

  9. 经验之谈:我为什么选择了这样一个激进的缓存大Key治理方案

    一.引言 本文将结合我的一次Redis大Key的治理经验,来浅谈一下缓存大Key的治理方案选择.文中主要包括缓存大Key基础知识.大Key治理方案选择.大Key治理案例等,适合有一定开发经验的开发者阅 ...

  10. web页面打开直接调用vlc播放视频

    简介 大家都知道现在我们在网页所播放的视频都是h264编码格式,可以供所有设备正常播放.然而,相比h265它的体积更大.质量更差.目前h265大多应用于安防,体积小可以更好的存储,不过它也有着缺点,成 ...