一、线程池关键参数以及运行原理

1、corePoolSize(核心线程数):线程池中线程的核心数量,线程池创建后池中并没有线程,而是等有任务的时候才去创建线程,如果任务过多并且核心线程数已经用完,则新加入的任务会被放入等待队列。

2、maximumPoolSize(最大线程数):一个重要的参数,表明池中所允许的最大线程数。

3、keepAliveTime(线程保持存活时间):线程在没有任务可执行的时候能保持多久时间会终止

4、TimeUnit(线程保持的时间单位):

TimeUnit.DAYS; //天

TimeUnit.HOURS; //小时

TimeUnit.MINUTES; //分钟

TimeUnit.SECONDS; //秒

TimeUnit.MILLISECONDS; //毫秒

TimeUnit.MICROSECONDS; //微妙

TimeUnit.NANOSECONDS; //纳秒

5、workQueue(任务等待队列):线程池中线程都在忙时,新加入的任务无法被执行时会放入此队列,等待被执行。当线程池中的线程执行完当前任务后,会从等待队列取出任务去执行。

6、RejectedExecutionHandler(拒绝策略):当等待队列已满并且线程数也达到了最大数,线程池就会根据拒绝策略执行后续操作,默认的是AbortPolicy。

ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。

ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。

ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)

ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务

运行原理如下图:

线程池原理图

1、新加入的任务去判断核心线程数是否已达标,否就去创建线程执行任务。是就去看任务队列是否加满,任务队列没有满就把新的任务加入到队列中等待执行,满的话就去判断最大线程数量是否达到,最大线程数没有达到就去创建新的线程执行任务,否则采用饱和策略来处理。

二、线程池有几种类型

JDK给我们提供了很方便的线程池工厂类Executors,提供了四种线程池。

1.cachedThreadPool 一个任务一个线程,适合I/O操作多的任务.

2.fixedThreadPool 核心池大小固定,适合处理快的任务.

3.singleThreadPool 只有一个thread处理所有的任务(SynchronousQueue).

4.scheduledThreadPool 可以定时,周期的执行任务(DelayQueue)

阿里巴巴Java开发手册里就明确不允许使用Executors创建线程池,一定要通过 ThreadPoolExecutor(xx,xx,xx...) 来明确线程池的运行规则,指定更合理的参数。

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler)

其实Executors工厂类的底层最终都是通过 new ThreadPoolExecutor() ExecutorService 实例。

三、happen-before原则

1、单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。

2、锁的happen-before原则:同一个锁的解锁操作happen-before此锁的加锁操作。

3、volatile的happen-before原则:对一个volatile变量的写操作happen-before对此变量的任意后续操作。

4、happen-before的传递性原则:如果A操作 happen-before B操作,B操作happen-before C操作,那么A操作happen-before C操作。

5、线程启动的happen-before原则:同一个线程的start方法happen-before此线程的其它方法。

6、线程中断的happen-before原则:对线程interrupt方法的调用happen-before被中断线程的检测到中断发送的代码。

7、线程终结的happen-before原则:线程中的所有操作都happen-before线程的终止检测。

8、对象创建的happen-before原则:一个对象的初始化完成先于他的finalize方法调用。

四、equals()与==

==:判断两个对象的内存地址是否一样(两个对象是否一样,基本数据类型比较的是值,引用类型比较的是内存地址)

equals()为object类的方法:

1、该方法没有被覆盖重写的话,等价于==

2、该方法被覆盖重写的话,一般用于比较两个对象内容是否一样,典型的就是String的equals()方法被覆盖过,比较的是值。

五、String、StringBuffer、StringBuild

是否可变:

String为final修饰的类,所以是不可变的,对其值的修改,相当于重新创建了一个String对象。

StringBuffer、StringBuild都是可变的字符串缓冲区,可以通过append()方法追加字符串修改值,通过toString()转为String。

安全性:

String为final修饰的,不可变所以在多线程中是安全的。

StringBuffer中的方法有synchronized修饰,所以先线程安全的。StringBuild是非线程安全的,所以性能上相对较好。

六、volatile关键字

1、保持共享变量内存可见性:每次操作volatile变量时,都会去主存中读取最新值并且操作完成后直接把最新值刷回主存,以便其他线程能读取到最新值。

2、防止指令重排序

七、synchronized与ReentrantLock的区别

1、都是可重入锁

可重入锁:自己可以再次获得自己的内部锁。(一个线程获取了某个对象的锁,如果还没有释放锁,其再次获取该对象的锁还是可以获取到的)

2、synchronized是jvm级别锁,而ReentrantLock是JDK提供的一个API(在使用锁的地方需要显示lock()和unlock()并配合try-catch-finally语句块来使用)

3、ReentrankLock锁可实现公平锁、等待可中断、可响应中断请求等机制。

八、list、set、map区别

list:存放有序,可重复元素

set存放不可重复的元素

map:key-value存储,map会根据key来存放值,key不能重复,两个不同的key可以存储相同的元素。

九、Arraylist、Vector的区别

相同点:

1、都是基于数组,根据下标索引可对元素进行随机访问

2、都能保证插入顺序

3、都允许存放null值

不同点

1、Vector是线程安全的,ArrayList非线程安全,所以效率上ArrayList要优

2、ArrayList可借助Collections工具类中的synchronizedList转为线程安全list

十、HashMap、HashTable的区别

1、HashMap是非线程安全的。HashTable是线程安全的,其内部方法有synchronized修饰,所以效率上HashMap要优于HashTable。

2、HashMap中可以存在null键,null值,但null键只能有一个,null可以有多个。HashTable不允许存在null键值,否则会报空指针

3、JDK1.8后,HashMap在解决hash冲突时,在链表长度达到阈值(8)的时候,链表会转为红黑树。HashTable没有这样的机制

说明:HashTable基本上被淘汰了,很少使用了,如果要用线程安全的Map,推荐ConcurrentHashMap(分段所技术实现的并发map,并发环境中效率更高)

java 时间转为毫秒数_疫情期间面试总结一(java基础方面)相关推荐

  1. java 获取当前时间的毫秒数

    记录一下关于获取当前时间毫秒数的三种方法 /*** 获取当前时间的毫秒数* @author laziji**/ public class Test{public static void main(St ...

  2. php记录当前毫秒,php获取当前时间的毫秒数的方法

    php获取当前时间的毫秒数的方法 php本身没有提供返回毫秒数的函数,但提供了一个microtime()函数,该函数返回一个array,包含两个元素,一个是秒数,一个是小数表示的毫秒数,借助此函数,可 ...

  3. linux mysql udf打包_Linux下MySQL 5.1编写UDF 并运行(Install)获取当前时间的毫秒数...

    Mysql 无法获取当前时间的毫秒数自行定制UDF,以提供current_ms方法1. 编写 C 文件#ifdef STANDARD#include lt;stdio.hgt;#inc Mysql 无 ...

  4. php得到时间 毫秒数,php获取毫秒_php获取当前时间的毫秒数

    摘要 腾兴网为您分享:php获取当前时间的毫秒数,中信金通,中日翻译,中国天气,夜读小说等软件知识,以及2265游戏盒,球球大作战,美业店务,黑手党3,互联空间,文本文档软件,upx脱壳,兔小贝儿歌, ...

  5. php 计算时间毫秒数,php获取毫秒_php获取当前时间的毫秒数

    摘要 腾兴网为您分享:php获取当前时间的毫秒数,夜读小说,虚拟按键,唯品会,调音器等软件知识,以及闪优360手柄,中国干部,大连快线,免vip网站,台达温控器,手淘链接转换,赢顺云期货交易,音序器, ...

  6. php 时间格式 毫秒,php获取当前时间的毫秒数详解

    php获取当前时间的毫秒数详解 var runtimes = 0; function GetRTime(){ var nMS = <?php echo $lefttime; ?>*1000 ...

  7. 常用时间格式毫秒数、年月日、国际通用时间之间相互转换(常用)

    JS实现时间格式毫秒数.年月日.国际通用时间转换 写在前面 1.毫秒数转年月日格式 2.国际通用时间转年月日格式 3.年月日格式换毫秒数 写在前面 本篇文章主要介绍JS实现毫秒数.年月日时间.国际通用 ...

  8. 获取时间戳(1970年1月1日零点整至当前时间的毫秒数)

    C# 时间戳格式一 /// <summary>/// 获取时间戳(1970年1月1日零点整至当前时间的毫秒数)/// </summary>/// <returns> ...

  9. new date.gettime 与传入时间相差毫秒数不对_给女票解释为什么日本时间比中国时间快一个小时?...

    马上就要五一劳动节放假了,忙碌了半年,准备趁着假期出去放松放松,于是开始准备行程.女朋友听说日本5月份可以看樱花,于是她在看去日本的航班.我在旁边默默的看了下我的信用卡额度. 如上图,飞机13:40 ...

最新文章

  1. android canvas 保存图片,ionic3 html5 video 抓图保存到手机相册,解决Android手机不支持Canvas drawImage问题...
  2. php exit、return、break、continue之间的差别,具体介绍
  3. shell实现矩阵转置
  4. SSH-permission denied (publickey,gssapi-keyex,gssapi-with-mic,password)
  5. 炫天塔罗占卜结果......
  6. html5怎么让div集中,html – 如何集中5个div而不使用margin-left?
  7. go语言 gosched
  8. 投资公司的钱是自己的吗?
  9. Matlab 之GUIDE界面设计:不同函数之间使用相同变量
  10. 一个老程序员“伯伯”的独白
  11. mysql check约束无效
  12. ROS 端口IP映射 动态IP映射
  13. 十大编程语言_2020年十大最佳编程语言
  14. 基于Multisim的简易数字钟
  15. mysql与gbase获取行号_mysql/gbase数据库全库库表记录数统计
  16. copypng emitted errors
  17. Excel自动转曲线图的时PHP,Excel折线图随着数据的插入动态变化,掌握此技能的人不足1﹪!...
  18. java 三维_java之三维数组
  19. Google搜索时如何在新标签页打开搜索结果
  20. php把buffer转化为图片_长微博生成(将html转化为图片)原理浅析

热门文章

  1. pytorch 的L1Loss 的计算方式和MAE 的计算方式的差异点
  2. 如何杀掉服务器的进程
  3. 用nohup重定向python输出到文件不成功的解决办法
  4. mui ajax传参示例
  5. Linux进程间通信——使用消息队列
  6. eclisep安装反编译插件jadClipse
  7. 3d激光雷达开发(绘制长方体)
  8. 3d激光雷达开发(平面分割)
  9. 深度学习实践与部署(开篇)
  10. python编程(json数据输入)