已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
让每一名学员高薪就业 解决Java多线程中11个常见问题1、线程是什么?简单来说,线程是进程中独立运行的子任务。2、创建线程的方式方式一:将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法方式二:声明实现 Runnable 接口的类。该类然后实现 run 方法推荐方式二,因为接口方式比继承方式更灵活,也减少程序间的耦合。3、获取当前线程信息?Thread.currentThread()4、线程的分类线程分为守护线程、用户线程。线程初始化默认为用户线程。setDaemon(true)将该线程标记为守护线程或用户线程。特性:设置守护线程,会作为进程的守护者,如果进程内没有其他非守护线程,那么守护线程也会被销毁,即使可能线程内没有运行结束。5、线程的生命周期线程是一个动态执行的过程,它也有一个从产生到死亡的过程。生命周期的五种状态:新建(new Thread):当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)。例如:Thread t1=new Thread();就绪(runnable):线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();运行(running):线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。死亡(dead):当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。堵塞(blocked):由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。6、线程间的关系?某线程a 中启动另外一个线程 t,那么我们称 线程 t是 线程a 的一个子线程,而 线程a 是 线程t 的 父线程。最典型的就是我们在main方法中 启动 一个 线程去执行。其中main方法隐含的main线程为父线程。7、线程API一览:如何启动、停止、暂停、恢复线程?(1)start() 使线程处于就绪状态,Java虚拟机会调用该线程的run方法;(2)stop() 停止线程,已过时,存在不安全性,原因如下:一是可能请理性的工作得不得完成;二是可能对锁定的对象进行“解锁”,导致数据不同步不一致的情况。推荐 使用 interrupt() +抛异常 中断线程。(3)yield() 线程礼让, 放弃当前线程的CPU资源。放弃时间不确认,也有可能刚刚放弃又获得CPU资源。(4)t.join() 正在执行t.join()语句的线程等待t线程运行完终止。8、synchronized关键字用法一 原子性(互斥性):实现多线程的同步机制,使得锁内代码的运行必需先获得对应的锁,运行完后自动释放对应的锁。二 内存可见性:在同一锁情况下,synchronized锁内代码保证变量的可见性。三 可重入性:当一个线程获取一个对象的锁,再次请求该对象的锁时是可以再次获取该对象的锁的。如果在synchronized锁内发生异常,锁会被释放。总结:(1)synchronized方法 与 synchronized(this) 代码块 锁定的都是当前对象,不同的只是同步代码的范围(2)synchronized (非this对象x) 将对象x本身作为“对象监视器”:a、多个线程同时执行 synchronized(x) 代码块,呈现同步效果。b、当其他线程同时执行对象x里面的 synchronized方法时,呈现同步效果。c、当其他线程同时执行对象x里面的 synchronized(this)方法时,呈现同步效果。(3)静态synchronized方法 与 synchronized(calss)代码块 锁定的都是Class锁。Class 锁与 对象锁 不是同一个锁,两者同时使用情况可能呈异步效果。(4)尽量不使用synchronized(string),是因为string的实际锁为string的常量池对象,多个值相同的string对象可能持有同一个锁。9、ReentrantLock的使用一个简单的示例:private java.util.concurrent.locks.Lock lock = new ReentrantLock();public void method() try lock.lock();/获取到锁lock,同步块 finally lock.unlock();/释放锁lockReentrantLock 比 synchronized 功能更强大,主要体现:(1)ReentrantLock 具有公平策略的选择。(2)ReentrantLock 可以在获取锁的时候,可有条件性地获取,可以设置等待时间,很有效地避免死锁。如 tryLock() 和tryLock(long timeout, TimeUnit unit)(3)ReentrantLock 可以获取锁的各种信息,用于监控锁的各种状态。(4)ReentrantLock可以灵活实现多路通知,即Condition的运用。10、线程间的通信方式线程间通信的方式主要为共享内存、线程同步。线程同步除了synchronized互斥同步外,也可以使用wait/notify实现等待、通知的机制。(1)wait/notify属于Object类的方法,但wait和notify方法调用,必须获取对象的对象级别锁,即synchronized同步方法或同步块中使用。(2)wait()方法:在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,或者其他某个线程中断当前线程,导致当前线程一直阻塞等待。等同wait(0)方法。wait(long timeout) 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。 单位为毫秒。void wait(long timeout, int nanos) 与wait(long timeout)不同的是增加了额外的纳秒级别,更精细的等待时间控制。(3)notfiy方法:唤醒在此对象监视器上等待的单个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。(4)notifyAll方法:唤醒在此对象监视器上等待的所有线程。需要:wait被执行后,会自动释放锁,而notify被执行后,锁没有立刻释放,由synchronized同步块结束时释放。应用场景:简单的生产、消费问题。synchronized (lock) /获取到对象锁locktry lock.wait();/等待通信信号, 释放对象锁lock catch (InterruptedException e) e.printStackTrace();/接到通信信号synchronized (lock) /获取到对象锁locklock.notify();/通知并唤醒某个正等待的线程 /其他操作/释放对象锁lock11、Executors框架(线程池)的使用(1)线程池是什么?线程池是一种多线程的处理方式,利用已有线程对象继续服务新的任务(按照一定的执行策略),而不是频繁地创建销毁线程对象,由此提供服务的吞吐能力,减少CPU的闲置时间。具体组成部分包括:a、线程池管理器(ThreadPool)用于创建和管理线程池,包括创建线程池、销毁线程池,添加新任务。b、工作线程(Worker)线程池中的线程,闲置的时候处于等待状态,可以循环回收利用。c、任务接口(Task)每个任务必须实现的接口类,为工作线程提供调用,主要规定了任务的入口、任务完成的收尾工作、任务的状态。d、等待队列(Queue)存放等待处理的任务,提供缓冲机制。(2)Executors框架常见的执行策略Executors框架提供了一些便利的执行策略。java.util.concurrent.ExecutorService service = java.util.concurrent.Executors.newFixedThreadPool(100);- newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。- newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。- newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。- newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。- newSingleThreadScheduledExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。(3)ExecutorService线程池管理ExecutorService的生命周期有3个状态:运行、关闭(shutting down)、停止。提交任务submit(xxx)扩展了基本方法 Executor.execute(java.lang.Runnable)。 Future submit(Callable task)提交一个返回值的任务用于执行,返回一个表示任务的未决结果的 Future。Future submit(Runnable task) 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。 Future submit(Runnable task, T result)提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。shutdown()启动一次顺序关闭,执行以前提交的任务,但不接受新任务。List shutdownNow() 试图停止所有正在执行的活动任务,暂停处理正在等待的任务,并返回等待执行的任务列表。一个简单的示例:public static void main(String args) ExecutorService executorService = Executors.newFixedThreadPool(10);for (int i = 0; i corePoolSize时,新提交任务会创建新线程执行任务4.当提交任务数超过maximumPoolSize时,新提交任务由RejectedExecutionHandler处理5.当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时,关闭空闲线程6.当设置allowCoreThreadTimeOut(true)时,线程池中corePoolSize线程空闲时间达到keepAliveTime也将关闭一个简单的示例:public static void main(String args) java.util.concurrent.ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(10, /corePoolSize 核心线程数100, /maximumPoolSize 最大线程数30, /keepAliveTime 线程池中超过corePoolSize数目的空闲线程最大存活时间;TimeUnit.SECONDS, / TimeUnit keepAliveTime时间单位new LinkedBlockingQueue(1000), /workQueue 阻塞任务队列Executors.defaultThreadFactory(), /threadFactory 新建线程的工厂new ThreadPoolExecutor.AbortPolicy() /RejectedExecutionHandl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 采购2025年农产品冷链物流配送合同协议合同
- 2025年母婴用品加盟合同协议合同
- 2025年快餐品牌加盟合同协议合同
- VR虚拟现实主题公园开发合同协议合同
- 人教版八年级上册历史(课件)第5课 甲午中日战争与列强瓜分中国狂潮
- 基于精细化视角的SLW单位地质勘查项目成本管理优化研究
- 基于精准护理的骶神经调控术患者个案管理干预方案构建与应用实践
- 基于粗糙集理论的列控车载设备故障诊断方法:原理、应用与优化
- 基于粒子群优化算法的齿轮箱智能故障诊断研究:方法与实践
- 基于第一性原理的新型碳同素异形体设计与性能的深度探究
- 网络安全事件应急响应处理流程
- 临床成人床旁心电监测护理规程
- 心理健康咨询记录表模板
- 中铁物资采购合同标准文本
- 中国典籍外译知到课后答案智慧树章节测试答案2025年春山东建筑大学
- 事故隐患内部报告奖励制度1
- 物业管理公司内部管理制度全
- 《基于STAMP的航空安全理论与实践》课件-第4章
- 北京市丰台区2024-2025学年七年级上学期期末地理试卷(含答案)
- 思想汇报发展对象3000字3篇
- 学校澡堂维修合同范例
评论
0/150
提交评论