- thread的生命周期
package java.lang; public class Thread implements Runnable { public void start(); public void run(); public void stop(); //已废除,勿使用 public void resume(); //已废除,勿使用 public void suspend(); //已废除,勿使用 public static void sleep(long millis); public static void sleep(long millis,int nanos); public boolean isAlive(); public void interrupt(); public boolean isInterrupted(); public static boolean interrupted(); public void join() throws InterruptedException; ...... }
如图所示 ,Thread生命期,需要注意的是,stop和rusume均已经废除
在这里,着重叙述一下Thread的interrupt方法。
Thread的stop方法已经被停用了,因此interrupt成了一个“终止线程”的方法,但是他又不是用来终止线程用的,比较绕口,简而言之,interrupt是为了结束线程的阻塞状态,观察interrupt的源码发现,其只是为线程设置了一个中断标记位。Thread.interrupt()方法不会中断一个正在运行的线程,这一方法 实际上完成的是,在线程受到阻塞时抛出一个中断信号,这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么, 它将接收到一个中断异常 InterruptedException InterruptedException ),从而提早地终结被阻塞状态。因此, 如果线程被上述几种方法阻塞,正确的停止线程方式是设置共享变量,并调用interrupt()(注 意变量应该先设置)。如果线程没有被阻塞,这时调用interrupt()将不起作用;否则,线程就 将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。在任何一种情况中,最 后线程都将检查共享变量然后再停止.
public class TestInterrupt extends Thread{ private volatile boolean stop=false; @Override public void run(){ System.out.println("thread is running"); try { System.out.println("thread is going to sleep"); if(!stop){ Thread.sleep(10*1000); } System.out.println("after thread sleep"); } catch (InterruptedException e) { // TODO Auto-generated catch block System.out.println("Thread is interupted"); } System.out.println("the thread is over!"); } public static void main(String[]args) throws InterruptedException{ TestInterrupt thread=new TestInterrupt(); thread.start(); Thread.sleep(4*1000); thread.stop=true; thread.interrupt(); Thread.sleep(3*1000); System.out.println("stopping application"); // System.exit(0); } }
打印结果:
thread is running thread is going to sleep Thread is interupted the thread is over! stopping application
由此可见,在线程阻塞后(sleep),使用interrupt()方法,代码try到中断异常,因此执行catch语句,值得一看的是,run()方法会继续从catch下面的语句执行,而不是跳出,因此会打印语句“the thread is over!”由此可见,中断并不会使线程停止,而是从当前sleep状态唤醒往下执行
- thread的基本使用方法
thread有两种方法使用,一种是直接继承Thread类,另一种是实现Runnable接口,比较而言,最常使用的是Runnable因为Java不支持多继承,因此只是继承Thread不够灵活。
相关推荐
Java并发编程学习笔记
java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记java并发编程实践笔记
java并发编程学习笔记,很详细的资料
Java并发编程学习笔记.
目前,在Java并发编程方面论述系统、内容详实的中文资料很少。本文是作者在实际工作中经验总结,部分内容来自《Java Concurrency In Practice》。涵盖了Java并发编程所需掌握的大部分知识,且实例丰富通俗易懂。读完...
Java并发编程学习笔记,研究JAVA并发多线程编程的一本教程,使用并发技术可以开发出并行算法,充分利用多处理器的计算能力,避免硬件资源浪费。目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java...
java并发编程实战pdf学习笔记 总结了重要的知识点
Java并发编程系列心得笔记,可以参考,欢迎共同交流学习
Java并发编程与高并发解决方案-学习笔记-www.itmuch.com
Java并发编程与高并发解决方案笔记-基础篇.docx
Java并发编程与高并发解决方案-学习笔记
Java并发编程 学习资料
java并发编程与并发解决方案是自己多年开发和学习的笔记,有助于(ˇˍˇ) 想~进一步提高的java开发工程师或架构师深入的学习java架构并发处理。同时,它也是 在实际工作中多年高并发解决方案和经验的总结
自己总结的java并发编程的笔记,绘制了详细的思维导图,每个思维导图中均有详细的博文解释,方便大家学习和理解,免费分享给大家。
Java并发编程 背景介绍 并发历史 必要性 进程 资源分配的最小单位 线程 CPU调度的最小单位 线程的优势 (1)如果设计正确,多线程程序可以通过提高处理器资源的利用率来提升系统吞吐率 ...
并发编程学习笔记,来源于 itmuch整理,是学习并发的不错的学习资料,有大神的个人感悟。介绍了一些概念,比如并发,高并发,并行,锁。
想对并发有一定了解的人群
主要是自己学习java多线程学习的笔记记录。作为新手练手也好,作为工作三年的我,来说只是作为跳槽之前的准备,之前对于java多线程真的是一知半解,只有到这里我才发现原来是长这样的基础模型。脚踏实地的一步一步的...
主要介绍了Java 并发编程学习笔记之Synchronized底层优化的相关资料,主要包含了重量级锁,轻量级锁,偏向锁和其他优化等方面,有需要的小伙伴可以参考下