java中interrupt、join、sleep、notify、notifyAll、wait详解
首先介绍一下中断概念:举个例子容易理解一点
例子:假如你正在给朋友写信,电话铃响了。这时,你放下手中的笔,去接电话。通话完毕,再继续写信。这个例子就表现了中断及其处理过程:电话铃声使你暂时中止当前的工作,而去处理更为急需处理的事情(接电话),把急需处理的事情处理完毕之后,再回头来继续原来的事情。在这个例子中,电话铃声称为“中断请求”,你暂停写信去接电话叫作“中断响应”,接电话的过程就是“中断处理”。
interrupt:中断线程
如果当前线程没有中断它自己(这在任何情况下都是允许的),则该线程的 checkAccess
方法就会被调用,这可能抛出 SecurityException
。
如果线程在调用 Object
类的 wait()
、wait(long)
或 wait(long, int)
方法,或者该类的 join()
、join(long)
、join(long, int)
、sleep(long)
或 sleep(long, int)
方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException
。
如果该线程在可中断的通道上的 I/O 操作中受阻,则该通道将被关闭,该线程的中断状态将被设置并且该线程将收到一个 ClosedByInterruptException
。
如果该线程在一个 Selector
中受阻,则该线程的中断状态将被设置,它将立即从选择操作返回,并可能带有一个非零值,就好像调用了选择器的 wakeup
方法一样。
如果以前的条件都没有保存,则该线程的中断状态将被设置。
中断一个不处于活动状态的线程不需要任何作用。
join:等待该线程终止
上传实例代码:
- /**
- * @author Potter
- * @version 创建时间:2011-6-30 上午09:11:32
- * 类说明:java中线程中join()是等待这个线程终止后执行后面的代码
- */
- public class JoinTest{
- public static String object="adb";
- public static void main(String[] args){
- Thread th=new Thread(new RunnableImpl());
- new ThreadTest(th).start();// 这个线程会持有锁
- th.start();
- try {
- th.join();
- System.out.println("joinFinish");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- class ThreadTest extends Thread{
- Thread thread;
- public ThreadTest(Thread thread){
- this.thread=thread;
- }
- public void run(){
- holdThreadLock();
- }
- public void holdThreadLock(){
- synchronized (JoinTest.object) {
- System.out.println("getObjectLock");
- try {
- Thread.sleep(5000);
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("ReleaseObjectLock");
- }
- }
- }
- class RunnableImpl implements Runnable {
- @Override
- public void run() {
- synchronized (JoinTest.object) {
- try {
- System.out.println("Begin sleep");
- Thread.sleep(2000);
- System.out.println("End sleep");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
/**
* @author Potter
* @version 创建时间:2011-6-30 上午09:11:32
* 类说明:java中线程中join()是等待这个线程终止后执行后面的代码
*/
public class JoinTest{
public static String object="adb";
public static void main(String[] args){
Thread th=new Thread(new RunnableImpl());
new ThreadTest(th).start();// 这个线程会持有锁
th.start();
try {
th.join();
System.out.println("joinFinish");
} catch (Exception e) {
e.printStackTrace();
}
}
}
class ThreadTest extends Thread{
Thread thread;
public ThreadTest(Thread thread){
this.thread=thread;
}
public void run(){
holdThreadLock();
}
public void holdThreadLock(){
synchronized (JoinTest.object) {
System.out.println("getObjectLock");
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("ReleaseObjectLock");
}
}
}
class RunnableImpl implements Runnable {
@Override
public void run() {
synchronized (JoinTest.object) {
try {
System.out.println("Begin sleep");
Thread.sleep(2000);
System.out.println("End sleep");
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
执行结果:
Begin sleep End sleep getObjectLock joinFinish ReleaseObjectLock
或者
getObjectLock ReleaseObjectLock Begin sleep End sleep joinFinish
原因:由于cup为实时处理,所以main线程、th线程、ThreadTest线程同时并发的,同时抢占cpu的。
sleep(long millis):在制定的毫秒数类让当前正在执行的线程暂停执行millis毫秒
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。该线程不丢失任何监视器的所属权
notify():唤醒在此对象监视器上等待的单个线程【随机的线程】
唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait
方法,在对象的监视器上等待。
直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。
此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:
- 通过执行此对象的同步实例方法。
- 通过执行在此对象上进行同步的
synchronized
语句的正文。 - 对于
Class
类型的对象,可以通过执行该类的同步静态方法。
一次只能有一个线程拥有对象的监视器。
notifyAll() :唤醒在此对象监视器上等待的所有线程
唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait
方法,在对象的监视器上等待。
直到当前线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。
此方法只应由作为此对象监视器的所有者的线程来调用。有关线程能够成为监视器所有者的方法的描述,请参阅 notify
方法。
java中interrupt、join、sleep、notify、notifyAll、wait详解的更多相关文章
- JAVA中的四种JSON解析方式详解
JAVA中的四种JSON解析方式详解 我们在日常开发中少不了和JSON数据打交道,那么我们来看看JAVA中常用的JSON解析方式. 1.JSON官方 脱离框架使用 2.GSON 3.FastJSON ...
- 高并发之wait notify notifyAll原理详解
public class WaitTest { public void testWait(){ System.out.println("Start-----"); try { wa ...
- Java中的String,StringBuffer,StringBuilder详解与区别
1.String Java中string类是不可变的,其中在声明的源代码中用的final,所以只能声明一次.所以每次在明面上的改变其实是重新生成一个String对象,指针指向新的String对象.同时 ...
- java中String是对象还是类?详解java中的String
有很多人搞不懂对象和类的定义.比如说java中String到底是对象还是类呢? 有人说String 既可以说是类,也可以说是对象. 其实他这么说也没问题, 类和对象其实都是一个抽象的概念. 我们可以把 ...
- C++/Java中继承关系引发的调用关系详解
C++: 这里引用到了 http://blog.csdn.net/haoel/article/details/1948051/ 中的内容,还请提前阅读陈大神的这篇博客后在阅读本篇. 覆盖,实现多态的基 ...
- Java中的双重检查(Double-Check)详解
在 Effecitve Java 一书的第 48 条中提到了双重检查模式,并指出这种模式在 Java 中通常并不适用.该模式的结构如下所示: ? 1 2 3 4 5 6 7 8 9 10 public ...
- Java中的宏变量,宏替换详解。
群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 首先来看下面这段程序,和群友分享的大致一样. public static void main(String[] args) { String ...
- java中Timer类的详细介绍(详解)
一.概念 定时计划任务功能在Java中主要使用的就是Timer对象,它在内部使用多线程的方式进行处理,所以它和多线程技术还是有非常大的关联的.在JDK中Timer类主要负责计划任务的功能,也就是在指定 ...
- java中ReentrantLock类的详细介绍(详解)
博主如果看到请联系小白,小白记不清地址了 简介 ReentrantLock是一个可重入且独占式的锁,它具有与使用synchronized监视器锁相同的基本行为和语义,但与synchronized关键字 ...
- java中Dateformat类的详细使用(详解)
DateFormat其本身是一个抽象类,SimpleDateFormat 类是DateFormat类的子类,一般情况下来讲DateFormat类很少会直接使用,而都使用SimpleDateFormat ...
随机推荐
- ExtJS学习
ExtJS是一门比较纠结的框架,自己不太熟,因为现在在做一些老项目,所以没办法要学点.记录下.其实Ext也不是很难,主要是多查查API,了解其基本的用法,然后慢慢去学习,学成之后做管理系统还是很有优势 ...
- SpringMVC中 解决@ResponseBody注解返回中文乱码
问题:在前端通过get请求服务端返回String类型的服务时,会出现中文乱码问题 原因:由于spring默认对String类型的返回的编码采用的是 StringHttpMessageConverter ...
- No module named pip.req
https://stackoverflow.com/questions/25192794/no-module-named-pip-req#
- saltstack相关
通过saltstack实现根据不同业务特性进行配置集中化管理,分发文件,采集服务器数据,操作系统基础及软件包管理等第一层为web交互层,采用django+mysql+bootstarp实现,服务端采用 ...
- 洛谷P1156 垃圾陷阱 dp
正解:dp 解题报告: 这儿是传送门! 话说最近怎么神仙们都开始狂刷dp,,,感觉今天写了好多dp的题解的样子?(也就三四道其实× 然后这题,首先看到要么吃要么堆起来就会想到01背包趴?然后就考虑设方 ...
- Instagram 架构分析笔记(转)
原文:http://dbanotes.net/?s=Instagram+%E6%9E%B6%E6%9E%84%E5%88%86%E6%9E%90%E7%AC%94%E8%AE%B0 作者:冯大辉 In ...
- CEO 是一家创业公司的天花板
大家说是不是呢?一秒钟内看到本质的人,和半辈子也看不清一件事本质的人,自然是不一样的命运.
- eclipse怎么导出可执行jar包
在eclpse中找到你要导出的java程序 选中它 单击文件 -->export 在弹出的export对话框中找到 jar File 单击选中-->next 按图示顺序依次 选好你的jav ...
- 一个Spark job的生命历程
一个job的生命历程 dagScheduler.runJob //(1) --> submitJob ( eventProcessLoop.post(JobSubmitted,***) //(2 ...
- 22. Generate Parentheses(回溯)
Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...