大家好,我是奇喵小屋,一个分享技术和生活的博主。以下是我的主页。各首页同步更新优质博客。创建起来并不容易。还请点开掘金主页了解主页Segmentfault主页开源中国更多MySQL、Redis、并发、JVM、分布式等面试热点知识稍后会在主页发布,还有Java学习路线、面试重点、职业规划、面经等相关博文转载请注明出处!0.Java线程面试题0.1线程占用的内存JDK1.4默认单线程占用256KJDK1.5默认单线程占用1M,可以通过-Xss参数设置0.2为什么要使用线程池来手动创建线程池缺点不受风控:服务器CPU资源有限。大家要是显示手动创建线程,不知道代码哪里有多线程。所有线程在运行时都在抢资源,频繁创建难以控制,管理开销过高:可能无限创建新线程,可能会占用太多系统资源,导致崩溃或OOM。重用现有线程减少了对象创建和消亡的成本。线程池的优点是性能好,减少系统资源消耗。通过复用现有线程,减少线程创建和销毁带来的消耗,提高系统响应速度。当一个任务到来时,通过复用现有线程,可以立即执行,无需等待新线程的创建,方便管理和控制并发线程数。1.线程状态1.1线程状态枚举NEW线程构造完成,尚未启动RUNNABLE运行状态BLOCKED阻塞状态,阻塞在LockWAITING等待状态TIME_WAITING超时等待状态,超时会自动回到TERMINATED终止状态,表示线程执行完成线程优先级创建线程时,可以为线程设置优先级。优先级越高的线程,被分配到的时间片越多的概率越高(不是绝对的)。3.线程中断可以理解为Thread有一个interrupted标识,默认为false,表示一个线程是否被其他线程中断过publicvoidinterrupt();//设置Thread的标识为falsepublicvoidisInterrupted();//returnidentifierpublicstaticisInterrupted();//返回Identifier,如果线程抛出InterruptedException则设置为false,然后抛出Interr在uptedException之前,JVM会先设置标识符为false,然后抛出4.线程间通信4.1通过volatile和synchronized4.2等待/通知机制sleep()当前线程进入TIME_WAITING状态,锁不会被释放,但是将被释放的CPU资源在一段时间后唤醒,回到RUNNABLE状态。yield()当前线程从RUNNING状态变为READY状态。不会释放锁,但是会释放CPU资源。wait()、notify()、nitifyAll()使用wait()、notify()、nitofyAll()需要锁定调用对象(必须在同步代码块中)。当前线程调用一个加锁对象的wait()后,会进入该对象的monitor对象的等待队列并释放锁,释放CPU资源,状态变为WAITING,当前线程调用notify()或一个锁定对象的nitifyAll(),等待队列中的线程从等待队列移动到同步队列,等待队列中线程状态由WAITING变为BLOKING如果线程想从wait()返回,另外对于调用notify()的其他线程,同样需要等待线程释放锁,获得对象锁后从wait()返回join()。注意wait()是Object的,join()是Thread的join()中wait()的底层调用。如果调用thread2.join(),则当前线程进入thread2的monitor对象的等待队列。是wait(),所以会释放锁,但是注意释放的是thread2锁4.3Waiting/NotificationSpecificationWaitingParty伪代码synchronized(object){while(conditionnotsatisfied){object.wait();}对应的处理逻辑}NotifierPseudocodesynchronized(object){改变条件object.nitify();}五、创建线程的方式1.继承Thread2。实现Runnable接口/使用匿名对象/lambda表达式3.实现Callable接口4.FutureTask(run()可以由调用线程执行,也可以作为任务提交到线程池)5.定时器6.ParallelStreamStream7.线程池隐式创建
