Java面试系列

Wesley13
• 阅读 818

实现多线程的方式

  • 继承Thread类,重写run方法,调用start方法启动线程

  • 实现Runnable接口,重写run方法,调用start方法启动线程

  • 实现Callable接口,重写call方法,并用FutureTask包装,在new Thread中传入FutureTask,然后调用start方法启动线程

  • 使用线程池

保证线程安全的方式

  • synchronized关键字实现的同步方法或者同步代码块

  • ReentrantLock等实现的锁机制

  • volatile关键字实现的变量线程安全

  • 使用AtomicInteger等原子类

  • 使用ConcurrentHashMap等线程安全容器

线程有哪些状态?

五个状态:初始化(New)、可运行(Runnable)、运行中(Running)、阻塞(Blocked)、死亡(Dead)。

Java面试系列

线程状态图

线程池的7个参数

public ThreadPoolExecutor(int corePoolSize,                           int maximumPoolSize,                           long keepAliveTime,                           TimeUnit unit,                           BlockingQueue<Runnable> workQueue,                           ThreadFactory threadFactory,                           RejectedExecutionHandler handler)

  • corePoolSize 核心线程数:一直存活的核心线程,不会销毁。

  • maximumPoolSize 最大线程数:提交一个任务,会先进入工作队列,如果队列无法加入,会创建新线程,然后从工作队列中取出一个任务交给新线程来处理,而刚提交的任务会进入工作队列。如果创建新线程导致线程数量超过最大线程,则会执行拒绝策略。

  • keepAliveTime 空闲线程存活时间:当线程数大于核心线程数时,空余线程等待新任务的最长时间。

  • unit 空闲线程存活时间单位

  • workQueue 工作队列

  • threadFactory 线程工厂:创建线程使用的工厂,可以用来指定线程名字。

  • handler 拒绝策略

工作队列:有四种

  • ArrayBlockingQueue:基于数组的有界阻塞队列,FIFO。

  • LinkedBlockingQuene:基于链表的无界阻塞队列,FIFO。如果指定长度可以充当有界队列,不指定长度则默认Interger.MAX,相当于是无界的。

  • SynchronousQuene:不缓存任务的阻塞队列,相当于没有队列。

  • PriorityBlockingQueue:具有优先级的无界阻塞队列。

拒绝策略:工作队列无法加入新任务,且线程数量达到最大线程数,则采用拒绝策略。也有四种

  • AbortPolicy:默认策略,直接丢弃任务,并且抛出异常。

  • CallerRunsPolicy:调用者直接执行拒绝任务的run方法。

  • DiscardPolicy:直接丢弃任务,啥都不做。

  • DiscardOldestPolicy:抛弃队列中最早的任务,并将当前任务放入队列。

线程池最多能同时处理多少个任务?

如果工作队列是有界队列,则最多:工作队列长度+最大线程数;如果工作队列是无界队列,则最多是无限个

Executors工具类有哪几种构造线程池的方法?

  • newFixedThreadPool:创建固定大小的线程池。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

  • newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。

  • newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。

  • newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

  • newSingleThreadScheduledExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。

JVM中哪些区域线程共享,哪些线程私有?

  • 线程共享:方法区、堆

  • 线程私有:Java栈、本地方法栈、程序计数器

Java面试系列

[

Java到底是引用传递还是值传递

2020-08-07

Java面试系列

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU2MDQ0NTI0OQ%3D%3D%26mid%3D2247484360%26idx%3D1%26sn%3D5a14e1ee21075361482e423cacd6846a%26chksm%3Dfc06a1e6cb7128f038cc37f1695a6984ce28aa4520bdd107874ba792b3f2f8f08552329ed930%26scene%3D21%23wechat_redirect)

[

数据库索引

2020-08-02

Java面试系列

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU2MDQ0NTI0OQ%3D%3D%26mid%3D2247484333%26idx%3D1%26sn%3D8313747b10396e2e7d34783634067372%26chksm%3Dfc06a183cb712895a55e7e3b1f70635147c7ce3be65eb35da00924188629b2fdf8f6934c42a1%26scene%3D21%23wechat_redirect)

[

事务:不好意思,你被隔离了!

2020-07-23

Java面试系列

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU2MDQ0NTI0OQ%3D%3D%26mid%3D2247484223%26idx%3D1%26sn%3D15776b9b6f43a26d9750a4baa089e16c%26chksm%3Dfc06a111cb71280726003c8911d9bf53a392a2ac4486a0dc7ed94d681070c3a980c794220392%26scene%3D21%23wechat_redirect)

[

spring事务咋和新冠病毒一样,还会传染?

2020-07-05

Java面试系列

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU2MDQ0NTI0OQ%3D%3D%26mid%3D2247484180%26idx%3D1%26sn%3Dd053e5901940a18b16708edd49f8aef6%26chksm%3Dfc06a13acb71282c9f4df086b5ef34be3bc549ad5d44919802865d05d9eec5819a55590388cb%26scene%3D21%23wechat_redirect)

[

数据是怎么一步一步到服务器的

2020-06-18

Java面试系列

](https://www.oschina.net/action/GoToLink?url=http%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU2MDQ0NTI0OQ%3D%3D%26mid%3D2247484154%26idx%3D1%26sn%3D5aae52994bdb508dbce52f339ba80967%26chksm%3Dfc06a0d4cb7129c2208edd849259e09ef9979d776e5243edf9250bc5b8fb693411deb18efb3c%26scene%3D21%23wechat_redirect)

本文分享自微信公众号 - pipi蛋(pipidan_fuyun)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java的编程逻辑
1、run()和start()的区别2、线程的基本属性和方法1.id:一个递增的整数,每创建一个线程就加一2.name3.优先级:从1到10,默认为5,会映射到系统中的优先级。数字越大,要优先级越高4.状态: NEW:还没调用start RUNABLE:正在执行run或者正在等待cup分配
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这