java基础面试题系列(101-112)[完结撒花]

2023-11-13

20200718 by 1z

  1. 请说明sleep() 和 wait()有什么区别?
1、sleep() 是Thread的成员方法而Wait()是Object的成员方法
2、sleep()没有释放锁,因此在sleep结束后依旧是原线程执行,而wait()释放了锁,在notify(notifyAll)后其他线程可以使用同步控制块或者方法。
3、wait,notify,notifyAll只能在同步控制块方法 or 同步控制块中使用,而sleep可以在任何地方使用。
  1. 请你说明一下在监视器(Monitor)内部,是如何做到线程同步的?在程序又应该做哪种级别的同步呢?
监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用(object or class)相关联。线程在获取锁之前不允许执行同步代码。

java中提供了显示监视器(Lock) 和 隐式监视器(synchronized)两种锁方案
  1. 请分析一下同步方法 和 同步代码块的区别是什么?
1.什么是同步方法 和 同步代码块
* 同步方法是有synchronized修饰符修饰的方法。java的每个对象都有着一个内置锁,当使用此关键字修饰方法时,内置锁会保护整个方法,在调用给方法前,要获取内置锁,否则处于阻塞状态。
public synchronized method(){}

* 同步代码块 是有synchronized修饰的方法,用该关键词修饰方法时,内置锁会保护整个方法,在调用给方法前,要获取内置锁,否则处于阻塞状态.
synchronized(Object o){}

2.同步方法 和 同步代码块的区别
* 同步方法默认用this或者当前类class对象作为锁
* 同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只同步会发生同步问题的部分代码而不是整个方法;
* 同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的方法,用synchronized(object){//需要同步的部分方法}进行修饰
  1. 请详细描述一下线程从创建到死亡的几种方式都有哪些?

在这里插入图片描述

  1. 创建线程有哪几种不同的方式,你喜欢哪一种?为什么?
(详见96题)
* 实现Runnable方法,简单,但是传参不方便
* 继承Thread重写run: 传递参数方便,但是java不支持多继承
* 使用FutureTask接口: 可以拿到任务的返回值 通过 实例化对象的get方法

我喜欢实现Runnable方法,因为可以使用lambda表达式方便快捷,而且可以多实现

new Thread(()->{
            try {
                //
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"threadName").start();
  1. 请解释一下java多线程回调是什么意思?
调用者执行调用时将自己作为参数给被调用者,被调用者达到一定条件之后通过这个参数调用 调用者
多线程下回调多用于同时计算运算的结果回调给调用者

存在客户程序 client,调用服务程序server中的方法func1,然后server在某个时候client的方法func2
对于client而言,func2就是回调方法。
  1. 请列举一下启动线程有哪几种方式,之后再说明一下线程池的种类有哪些?
1.启动线程的方式(详见96题)
继承Thread类,重写run方法。
实现Runnable接口,重写run方法。
实现callable接口,重写call方法启动线程用start方法
参考链接 https://blog.csdn.net/qq_41555783/article/details/102001231

2.线程池的种类
newsingleThreadExecutor:单线程的线程池,处理完一个任务接着下一个,若异常则起一个新的线程

newFixedThreadPool:指定数目的线程池,如果多于这个数目则加入缓存队列

newcachedThreadPool:不限数目的线程池,完全依赖于JVM能创建的线程数,可能出现内存不足

自定义线程池(见90题)
  1. 请简要说明一下Java中cyclicbarrier 和 countdownlatch的区别分别是什么?
1. cyclicbarrier支持重用,而countDownLatch不支持重用

2. countdownlatch用于保持多个线程之间的执行顺序,cyclicbarrier用于一组线程互相等待对方执行一些操作后再一起继续执行。

3. CountDownLatch一般用于某个线程A等待若干个线程执行完任务之后才进行
而 CyclicBarrier一般用于一组线程互相等待至某个状态,然后再同时执行。

4. countdownlatch是计数器,线程完成一个就记一个,做递减操作,而CyclicBarrier更像一个水闸,线程执行就想水流动,但是会在水闸处停止,直至水满(线程都运行完毕)才开始泄流。

参考链接: https://blog.csdn.net/paul342/article/details/49661991
  1. 请说明一下线程池有什么优势?
创建一个对象要获取内存资源或其他更多资源。在Java中更加如此,虚拟机将视图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象的创建和销毁,这就是“池化资源”技术产生的原因。

线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程,而是返回池中从而减少创建和销毁对象的开销。
  1. 请说明一下java中有几种线程池,并且详细描述一下线程池的实现过程
1. java api中提供了三种线程池
newsingleThreadExecutor:单线程的线程池,处理完一个任务接着下一个,若异常则起一个新的线程

newFixedThreadPool:指定数目的线程池,如果多于这个数目则加入缓存队列

newcachedThreadPool:不限数目的线程池,完全依赖于JVM能创建的线程数,可能出现内存不足

使用方法:
 public static void testSingleThread() {
        ExecutorService singleService = Executors.newSingleThreadExecutor();
        try {
            for (int i = 0; i < 10; i++) {
                singleService.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "在工作\t");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            singleService.shutdown();
        }
    }
-----------------------------------------------------------------------------
2. 线程池的详细实现过程和代码演示

package com.liz.juc.thread_pool.relearn_thread_pool;

import java.util.concurrent.*;

/**
 * 自定义线程池的七大参数:
 * 1.corePoolSize : 核心线程数,先来的线程可以直接为核心线程,当线程数 在corePoolSize和maximumPoolSize之间的时候,其他线程放入队列中
 * 如果超过了maxiumPoolSize,采用拒绝策略
 * <p>
 * 2.maximumPoolSize : 最大线程数,在系统线程池中的CacheThreadPool方案,该值为Integer.MAXVALUE 很容易出现oom
 * <p>
 * 3.KeepAliveTime : 线程池中空闲线程等待工作的超时时间,单位是ns,一旦超时,直接进行销毁
 * <p>
 * 4.TimeUnit.SECONDS : 设置超时时间
 * <p>
 * 5.BlockingQueue<Runnable> workQueue : 默认的消息队列(存放闲置线程)
 * <p>
 * 6.ThreadFactory threadFactory : 线程工厂,设置为默认工厂即可 Executors.defaultThreadFactory()
 * <p>
 * 7.RejectedExecutionHandler handler : 拒绝策略
 * new ThreadPoolExecutor.AbortPolicy() 直接抛出异常
 * new ThreadPoolExecutor.CallerRunsPolicy() 调节机制,多出的线程回退给调用者线程 哪个线程调用了就给谁去处理
 * new ThreadPoolExecutor.DiscardOldestPolicy() 丢弃最老的一个请求(最先入队列的那几个),并尝试再次提交任务
 * new ThreadPoolExecutor.DiscardPolicy() 默默丢失不能处理的任务【不予任何处理】
 */
public class MyThreadPool {
    public static void main(String[] args) throws InterruptedException {
        testMyThreadPool();
    }

    public static void testMyThreadPool() throws InterruptedException {
        ExecutorService myPool = new ThreadPoolExecutor(
                2,
                8,
                2L,
                TimeUnit.SECONDS,
                new LinkedBlockingQueue<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.AbortPolicy()
        );

        try {
            for (int i = 0; i < 10; i++) {
                myPool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "\t 在工作");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            myPool.shutdown();
        }
        ThreadSafe safe = new ThreadSafe();
        safe.start();
        System.out.println("running");
        System.out.println();
        Thread.sleep(2000);
        safe.interrupt();

    }

    static class ThreadSafe extends Thread{
        @Override
        public void run() {
            while(!isInterrupted()){
                try {
                    Thread.sleep(1000);
                    System.out.println("I am alive");

                } catch (InterruptedException e) {
                    e.printStackTrace();
                    break;//捕捉到中断异常 直接白给
                }
            }
        }
    }

}

  1. 请说明一下Java中都有哪些方式可以启动一个线程?
1.启动线程的方式(详见96题)
继承Thread类,重写run方法。
实现Runnable接口,重写run方法。
实现callable接口,重写call方法启动线程用start方法
参考链接 https://blog.csdn.net/qq_41555783/article/details/102001231
  1. 请列举一下创建线程的方法,并简要说明一下在这些方法中哪个方法更好,原因是什么?
* 实现Runnable方法,简单,但是传参不方便
* 继承Thread重写run: 传递参数方便,但是java不支持多继承
* 使用FutureTask接口: 可以拿到任务的返回值 通过 实例化对象的get方法

我喜欢实现Runnable方法,因为可以使用lambda表达式方便快捷,而且可以多实现

new Thread(()->{
            try {
                //
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"threadName").start();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java基础面试题系列(101-112)[完结撒花] 的相关文章

  • css清除默认样式

    清除默认样式 初始化样式 清除内外边距 margin 0 padding 0 自减盒子模型 box sizing border box ul ol 清除默认圆点 list style none a 取消下划线 text decoration
  • 华南x79 主板说明书下载_主板说明书找不到 机箱连线照样秒安装

    点击上方 电脑爱好者关注我们 小伙伴们在安装 升级电脑的时候 在主板上安装各种配件应该问题不大 但是连线呢 特别是机箱上那些细碎的小接口们 即使照着说明书都要琢磨半天 如果是老主板 一下子找不到说明书怎么办 这里小编就跟大家说一些简单的办法
  • windows上 nginx 配置好了access.log路径后,但是访问日志并没有记录

    windows 上配置 nginx access log 日志 1 问题 2 解决方案 2 1 为当前文件夹配置权限 3 结果 1 问题 之前 本机上配置了 nginx access log 日志 但是 并没有 记录 当时因为太忙了 就没有
  • 【Mybatis源码分析】动态标签的底层原理,DynamicSqlSource源码分析

    DynamicSqlSource 源码分析 一 DynamicSqlSource 源码分析 DynamicContext源码分析 SqlNode源码分析 动态SQL标签 Mybatis 动态SQL标签 举例 调试 SqlNode源码分析 M
  • Ubuntu/Linux下安装DosBox配置汇编环境

    Ubuntu Linux下安装DosBox配置汇编环境 微信关注公众号 夜寒信息 致力于为每一位用户免费提供更优质技术帮助与资源供给 感谢支持 一 首先我们去DosBox官网下载DosBox 0 73 或者直接启用终端命令行输入以下代码 s
  • leveldb深度剖析-查询流程

    至此 将插入流程以及压缩流程都已介绍完毕了 本篇主要介绍查询流程 一 查询流程 首先来看一下查询接口具体实现内容 查询 param options 查询选项 param key 查询key param value 输出参数 如果找到则赋值给
  • TypeScript 基础教程,适合新手

    TypeScript 基本用法 本章介绍 TypeScript 的一些最基本的语法和用法 最全教程 https tut qzxdp cn typescript 在线工具 https tools qzxdp cn 类型声明 TypeScrip
  • 本地部署IIS服务及MQTT服务

    本地部署IIS服务及MQTT服务 概述 配置IIS 安装windows功能 配置应用程序 打开IIS服务 安装aspnetcore runtime 安装dotnet hosting 检查 添加网站 配置应用程序 配置IIS通过外部IP访问
  • YOLOv5 or YOLOv8 快速划分训练集 验证集 测试集

    该脚本实现了将原始数据集自动划分为yolo训练数据集排列形式 import os import random import shutil 该脚本实现了将原始数据集自动划分为yolo训练数据集排列形式 目录排序如下 old root data
  • 【mind+】机器人对话互动游戏编程

    目录 前言 不要多言 请看下面的代码 一 代码 1 机器人回答问题 2 机器人互动和状态改变 前言 应用mind 软件写一个机器人互动的程序 程序要求 1 提出问题 机器人做出相对应的回答 2 点击机器人 它做出随机语录回复 提前准备 添加
  • 【SSL_1232】雷达覆盖

    思路 以一个点作为平角 计算几何统计 c o d e code code include
  • 在虚拟机中win10启用远程桌面的方法

    1 打开虚拟机 选择此电脑 右键属性 2 选择远程桌面 开启服务 3 打开cmd 输入ipconfig 查看IP 4 在宿主机上按住win r快捷键 输入matsc 打开远程桌面连接 输入虚拟机的ip 5 输入虚拟机的用户名和密码 6 连接
  • 虚拟机网络桥接,详细操作步骤,本地连接虚拟机

    虚拟机网络桥接 文章目录 虚拟机网络桥接 一 首先查看主机连接网络的网关 二 打开虚拟机的worksation服务 三 修改主机的VMnet8的IPV4属性 四 修改虚拟机的workstation的虚拟网络 五 修改VMnet8的IP 网关

随机推荐

  • ATK&ck靶场系列二

    信息收集 nmap sP 192 168 111 0 24 nmap sS T4 A v p 192 168 111 80 nmap sS T4 A v p 192 168 111 80 Starting Nmap 7 93 https n
  • 录音时分离左右声道的数据

    平台录音默认为8通道数据 保存到文件中取左右声道数据 当mic 1时 取左声道数据 当mic 2时 取右声道数据 private byte splitStereoPcm byte data int monoLength data lengt
  • Spring Bean基础

    Spring Bean基础 1 1 定义Spring Bean 1 1 1 什么是BeanDefinition 1 2 通过BeanDefinition构建Bean 1 3 注册Bean BeanDefinition 注册 1 4 实例化S
  • SQL中按分隔符拆分字符串

    一 Oracle数据库按分隔符拆分字符串 1 应用函数 REGEXP SUBSTR 2 语法 REGEXP SUBSTR String pattern position occurrence modifier 3 参数解释 srcstr 需
  • 【计算机操作系统】第三章 处理机调度与死锁

    在多道程序环境下 主存中有着多个进程 其数目往往多于处理机数目 这就要求系统能按某种算法 动态地把处理机分配给就绪队列中的一个进程 使之执行 分配处理机的任务是由处理机调度程序完成的 由于处理机是最重要的计算机资源 提高处理机的利 用率及改
  • spring boot引入mybatis plus,使用通用mapper、service

    一 mybatis plus官方文档 mybatis plus官方文档 二 spring boot 引入mybatis plus 在指定项目的pom xml文件下添加以下代码
  • JMeter 5.3/MeterSphere v1.1.2接口测试工具安装

    最近工作需要对web服务接口进行压力测试 由于完全没有测试相关经验 就只能走一步看一步了 由于主要是测试接口的并发性能 因而需要一个能并发产生请求的工具 最开始想到用postman 毕竟对这玩意儿比较了解 但是结果是 这个东西虽然能够在短时
  • 从零开始学Python(4) -----用Jupyter绘制各种图形

    在上一次学习中 我们介绍了如何加载CSV文件 并在Jupyter笔记本上绘制条形图 这次 我们将介绍如何从CSV文件中提取任意数据并绘制各种图形 让我们看看股票是涨还是跌 之前 我们已经体验了用Pandas库来读取读取CSV数据并绘制图表
  • 软件工程 第五章 详细设计

    1 详细设计的内容是什么 内容 1 确定每个模块的算法 2 确定每一个模块的数据组织 3 为每个模块设计一组测试用例 4 编写详细设计说明书 原则 1 模块的逻辑描述正确可靠 清晰易读 2 采用结构化程序设计方法 改善控制结构 降低程序复杂
  • vue router 动态路由清除

    重置matcher可达到路由还原效果 在用户退出时调用 resetRouter router 即可还原路由 import Vue from vue import Router from vue router import constantR
  • 为什么出现下一代云计算-分布式云 ?

    2020年10月19日 Garnter发布了2021年战略技术趋势 至此 分布式云连续两年 2020 2021 被列入Gartner战略技术趋势榜单了 分布式云 Distributed Cloud Gartner预测 到2025年 超过50
  • [cmake命令笔记]CMake添加C++预定义宏add_definitions

    比如要在代码中有进行宏判断的地方 ifdefine IMAGE PNG xxx endif ifdefine IMAGE JPG xxx endif ifdefine IMAGE TIFF xxx endif 你需要通过宏执行响应代码 那么
  • pytorch:线性回归(Regression)

    使用pytorch python实现回归 程序 import torch import torch nn functional as F from matplotlib import pyplot as plt 创建数据 x torch u
  • Jtest简介

    Jtest是一个集成的 易于使用和Java单元测试工具 它能够自动测试任何Java类 JSP或部件 而不需要你编写一个测试用例 测试驱动程序和测试桩 只需一键 Jtest自动测试代码的构造 白盒测试 代码功能 黑盒测试 并维护代码的完整性
  • caffe convert_image 初略解析

    需要的基础知识 OpenCV 建议去看官网的图文教程 LevelDB http dblab cs toronto edu courses 443 2014 tutorials leveldb html 这个是我学习的教程 今天在看caffe
  • 时序预测

    时序预测 MATLAB实现贝叶斯优化LSTM时间序列预测 BO LSTM 预测效果 基本介绍 相对于模型的参数而言 Parameter 我们知道机器学习其实就是机器通过某种算法学习数据的计算过程 通过学习得到的模型本质上是一些列数字 如树模
  • uni-app富文本渲染方案rich-text、uparse、v-html简单解析

    uniapp语法 rich text 1 rich text是uni app的内置组件 提供了高性能的富文本渲染模式 2 API参考https uniapp dcloud io component rich text 3 rich text
  • 基于PHP的旅游管理系统

    系列文章目录 基于SpringBoot的高校在线答疑管理系统 基于SpringBoot的外卖点餐管理系统 基于SpringBoot的实验室管理系统 目录 系列文章目录 前言 一 相关技术 二 系统设计 1 系统体系结构 2 数据库设计原则
  • [人工智能-数学基础-1]:深度学习中的数学地图:计算机、数学、数值计算、数值分析、数值计算、微分、积分、概率、统计.....

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119710145 目录 1 为
  • java基础面试题系列(101-112)[完结撒花]

    20200718 by 1z 请说明sleep 和 wait 有什么区别 1 sleep 是Thread的成员方法而Wait 是Object的成员方法 2 sleep 没有释放锁 因此在sleep结束后依旧是原线程执行 而wait 释放了锁