面试刷题17:线程两次start()会发生什么?
线程是并发编程的基础元素,是系统调度的最小单元,现代的jvm直接对应了内核线程。为了降低并发编程的门槛,go语言引入了协程。
你好,我是李福春,我在准备面试,今天的题目是?
一个线程两次调用start()方法会发生什么?
答:线程两次调用start()方法会抛出IllegalThreadStateException,这是一种运行时异常。
接下来针对面试官可能深挖的内容做一些扩展。
线程的存储结构
画一个简图:
重点说一下ThreadLocal,这个是线程私有空间,提供了一种保存线程私有信息的机制。
整个线程的生命周期中有效。
可以在线程关联的各个模块之间传递信息,比如 常见的三层模型,controller,service, dao之间可以传递线程私有的一些透传信息,比如事务id,跟踪id等。
ThreadLocal的源码比较简单,内部使用了一个基于弱引用的ThreadLocalMap,key是线程,value是正常值。
需要注意的是,在工作线程中必须显示的清理,否则容易引发oom问题。
线程的生命周期
线程的状态直接查看源码,java.lang.Thread.State ;
图中很清楚的说明了状态变迁的驱动方法。
线程的其它方法
runnable:
创建线程的优点:
1, 不受单继承的限制,更灵活。
2,重用代码实现方便,更容易复用。
3, 跟Executor框架可以更好的集成。
守护线程
应用需要一个长期主流的服务,但是不希望影响进程的退出。
必须在线程启动之前设置,即start方法调用之前,设置方法 thread.setDaemon(true);
线程异常唤醒
使用while语句替换if语句,防止线程被异常唤醒
其它方法
等待方法: join(等待执行完毕), yield(告诉调度器,主动让出cpu)
wait,notify,notifyall, 提供了进程的同步协作工具,但是有了并发包之后,不再需要。
小结
本篇回答了一个常规面试问题,线程两次start会发生什么?然后从线程的存储,线程的状态充分认识了线程这个系统基本调度单元。
然后结合面试官喜欢问的,ThreadLocal,Runnable,守护线程等知识点进行了简单扩展。
原创不易,转载请注明出处。
面试刷题17:线程两次start()会发生什么?的更多相关文章
- 安利一个基于Spring Cloud 的面试刷题系统。面试、毕设、项目经验一网打尽
推荐: 接近100K star 的Java学习/面试指南 Github 95k+点赞的Java面试/学习手册.pdf 今天给小伙伴们推荐一个朋友开源的面试刷题系统. 这篇文章我会从系统架构设计层面详解 ...
- ubuntu下vim配置(刷题和比赛两套)
1. 平时刷题练习使用 "mswin.vim 插件提供windows下的编辑快捷键功能 source $VIMRUNTIME/mswin.vim behave mswin set nu se ...
- Java基础面试操作题:线程同步代码块 两个客户往一个银行存钱,每人存三十次一次存一百。 模拟银行存钱功能,时时银行现金数。
package com.swift; public class Bank_Customer_Test { public static void main(String[] args) { /* * 两 ...
- 相似的RGB颜色——算法面试刷题3(for google),考察二分
在本题中,每个大写字母代表从“0”到“f”的一些十六进制数字. 红绿蓝三元色#AABBCC可以简写为#ABC. 例如,#15c是颜色#1155cc的简写. 现在,假设两种颜色#ABCDEF和#UVWX ...
- AI面试刷题版
(1)代码题(leetcode类型),主要考察数据结构和基础算法,以及代码基本功 虽然这部分跟机器学习,深度学习关系不大,但也是面试的重中之重.基本每家公司的面试都问了大量的算法题和代码题,即使是商汤 ...
- 面试刷题32:你对tomcat做了哪些性能调优?
背景 java程序员的开发的java应用程序,一般都会选择使用tomcat发布,但是: 如何充分的掌控tomcat,并让它发挥最优性能呢? 这也是面试的热点问题,结合多年的工作实践,我是李福春,今天总 ...
- 有效的括号序列——算法面试刷题4(for google),考察stack
给定一个字符串所表示的括号序列,包含以下字符: '(', ')', '{', '}', '[' and ']', 判定是否是有效的括号序列. 括号必须依照 "()" 顺序表示, & ...
- 回文的范围——算法面试刷题2(for google),考察前缀和
如果一个正整数的十进制表示(没有前导零)是一个回文字符串(一个前后读取相同的字符串),那么它就是回文.例如,数字5, 77, 363, 4884, 11111, 12121和349943都是回文. 如 ...
- Java面试经典题:线程池专题
1.什么是线程池 线程池的基本思想是一种对象池,在程序启动时就开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理.当有线程任务时,从池中取一个,执行完成后线程对象归池, ...
随机推荐
- iptables学习02-nat表应用
nat表应用实验 第一步 准备工作 A机器两块网卡ens33(192.168.2.106).再添加一块自定义网卡ens37(192.168.100.1),添加到LAN内网区段(自定义名字,写什么无所谓 ...
- 热更新,App双开,App隐藏,App试用 -- Replugin的实际应用(原创)
热更新,App双开,App隐藏,App试用 -- Replugin的实际应用(原创) RePlugin是Qihoo 360公司的开源框架,原本目的是用于热更新.但是,这个框架提供的功能远远超出了热更新 ...
- Java工厂模式解耦 —— 理解Spring IOC
Java工厂模式解耦 -- 理解Spring IOC 最近看到一个很好的思想来理解Spring IOC,故记录下来. 资源获取方式 主动式:(要什么资源都自己创建) 被动式:(资源的获取不是我们创建, ...
- 性能测试之Mysql数据库调优
一.前言 性能调优前提:无监控不调优,对于mysql性能的监控前几天有文章提到过,有兴趣的朋友可以去看一下 二.Mysql性能指标及问题分析和定位 1.我们在监控图表中关注的性能指标大概有这么几个:C ...
- 《OneForAll框架搭建之旅》前端篇:微前端架构设计(Vue)
心之所向,勇往直前!记录开发过程中的那些小事,给自己加点经验值. 前言 作为一个.Net后端开发,在竞争愈加激烈的当下,掌握点前端配菜好像已经是家常便饭了. 刚好在工作的第5个年头,辞去小主管职务的我 ...
- C#编程_单线程IP地址解析
单线程IP地址解析 目标程序 界面如下图 设计方法:完成单个IP地址解析,循环调用方法,完成扫描. 注意用stopwatch计算时间. 实现思路 先知道怎么解析一个单个的IP地址. 用循环的方法解 ...
- vue.js 中使用(...)运算符报错
今天在起别人项目的时候, 发现报错. 这个错误是,项目中不识别es6的扩展运算符, 解决方式很简单. // 第一步 cnpm install babel-plugin-transform-object ...
- Error response:/usr/bin/tf_serving_entrypoint.sh: line 3: 6 Illegal instruction (core dumped) ...
用docker部署tensorflow-serving:gpu时,参照官方文档:https://tensorflow.google.cn/tfx/serving/docker 本应该是很简单的部署,没 ...
- JavaScript判断一个对象是否为空
本文介绍了判断一个对象是否为空的几种方法 测试用例 test1 = 1; test2 = {}; test3 = {a:1,b:2} 1. 判断Object.keys()的长度 function _i ...
- 大数据篇:ElasticSearch
ElasticSearch ElasticSearch是什么 ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口. ...