join(long)方法的源代码

     public final synchronized void join(long millis)
throws InterruptedException {
long base = System.currentTimeMillis();
long now = 0; if (millis < 0) {
throw new IllegalArgumentException("timeout value is negative");
} if (millis == 0) {
while (isAlive()) {
wait(0);
}
} else {
while (isAlive()) {
long delay = millis - now;
if (delay <= 0) {
break;
}
wait(delay);
now = System.currentTimeMillis() - base;
}
}
}

sleep(long)方法的源代码

public static native void sleep(long millis) throws InterruptedException;

从源代码中可以发现,join(long)方法内部使用wait(long)实现,所以join(long)方法执行后会释放锁,所以其他线程就可以调用此线程中的同步方法

验证sleep(long)方法会不会释放锁

--------------------------------------------------------线程类--------------------------------------------------------

 package com.qf.test04.thread;

 /**
* @author qf
* @create 2018-09-20 15:22
*/
public class ThreadA extends Thread {
private ThreadB threadB; public ThreadA(ThreadB threadB) {
this.threadB = threadB;
} @Override
public void run() {
try {
synchronized (threadB){
threadB.start();
Thread.sleep(6000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
 package com.qf.test04.thread;

 /**
* @author qf
* @create 2018-09-20 15:22
*/
public class ThreadB extends Thread {
@Override
public void run() {
try {
System.out.println("b run begin time = "+System.currentTimeMillis());
Thread.sleep(5000);
System.out.println("b run --end time = "+System.currentTimeMillis());
} catch (InterruptedException e) {
e.printStackTrace();
}
} public synchronized void bService(){
System.out.println("bService time = "+System.currentTimeMillis());
}
}
 package com.qf.test04.thread;

 /**
* @author qf
* @create 2018-09-20 15:22
*/
public class ThreadC extends Thread {
private ThreadB threadB; public ThreadC(ThreadB threadB) {
this.threadB = threadB;
} @Override
public void run() {
threadB.bService();
}
}

--------------------------------------------------------测试类--------------------------------------------------------

 package com.qf.test04;

 import com.qf.test04.thread.ThreadA;
import com.qf.test04.thread.ThreadB;
import com.qf.test04.thread.ThreadC; /**
* @author qf
* @create 2018-09-20 15:22
*/
public class Run {
public static void main(String[] args) {
try {
ThreadB b = new ThreadB();
ThreadA a = new ThreadA(b);
a.start();
Thread.sleep(1000);
ThreadC c = new ThreadC(b);
c.start();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

-------------------------------------------------------打印输出------------------------------------------------------

b run begin time = 1537429005098
b run --end time = 1537429010098
bService time = 1537429011098

结果显示只有a线程执行完毕(sleep了6000ms),c线程才能执行,所以sleep方法并没有释放锁

验证join(long)方法释放锁

修改ThreadA.java中的代码

-----------------------------------------------------ThreadA.java----------------------------------------------------

 package com.qf.test04.thread;

 /**
* @author qf
* @create 2018-09-20 15:22
*/
public class ThreadA extends Thread {
private ThreadB threadB; public ThreadA(ThreadB threadB) {
this.threadB = threadB;
} @Override
public void run() {
try {
synchronized (threadB){
threadB.start();
//Thread.sleep(6000);
threadB.join();
for (int i = 0; i < Integer.MAX_VALUE ; i++) {
//用于耗时
String newString = new String();
Math.random();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

-------------------------------------------------------打印输出------------------------------------------------------

b run begin time = 1537429346791
bService time = 1537429347790
b run --end time = 1537429351793

bService在1000后执行打印,说明c线程获得了threadB的锁,所以a线程在join后释放了锁

join(long)方法和sleep(long)方法的比较的更多相关文章

  1. $(document).ready()即$()方法和window.onload方法的比较

    以浏览器装载文档为例,我们都知道在页面完毕后,浏览器会通过JavaScript为DOM元素添加事件.在常规的JavaScript代码中,通常使用window.onload方法,而在jQuery中,使用 ...

  2. Server.Transfer方法,Server.Execute方法和Response.Redirect方法有什么异同

    (1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页 ...

  3. java——多线程——单例模式的static方法和非static方法是否是线程安全的?

    单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...

  4. synchronized 修饰在 static方法和非static方法的区别

    Java中synchronized用在静态方法和非静态方法上面的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法.也可以synchroniz ...

  5. $(document).ready()方法和window.onload()方法

    $(document).ready()方法和window.onload()方法 $(document).ready()方法是JQuery中的方法,他在DOM完全就需时就可以被调用,不必等待这些元素关联 ...

  6. Html.Partial方法和Html.RenderPartial方法

    分布视图 PartialView 一般是功能相对独立的,类似用户控件的视图代码片段,可以被多个视图引用,引用方式如下. 1,Html.Partial方法和Html.RenderPartial方法 静态 ...

  7. tornado的IOLoop.instance()方法和IOLoop.current()方法区别

    在使用tornado时,经常有人疑惑IOLoop.instance()方法和IOLoop.current()方法的区别是什么. IOLoop.instance() 返回一个全局 IOLoop实例. 大 ...

  8. 【转载】C#中double.TryParse方法和double.Parse方法的异同之处

    在C#编程过程中,double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型,但两者还是有区别,最重要的区别在于double.TryParse方法 ...

  9. 【转载】 C#中decimal.TryParse方法和decimal.Parse方法的异同之处

    在C#编程过程中,decimal.TryParse方法和decimal.Parse方法都可以将字符串string转换为decimal类型,但两者还是有区别,最重要的区别在于decimal.TryPar ...

随机推荐

  1. 同一台机器上有多个Python版本?

    有关Python网站上的官方文档,如何在Linux上的同一台机器上安装和运行多个版本的Python? 我可以找到大量的博客帖子和答案,但我想知道是否有“标准”官方方式这样做? 或者这完全取决于操作系统 ...

  2. python发送邮件,文件后缀变成了bin

    问题:在用python做自动化测试时,将html测试报告在邮件中添加文件发送的过程中,发现发送成功后,文件的后缀为.bin 解决方法: 加一行代码 msg_att["Content-Disp ...

  3. 三、python之文件的处理

    1.文件的读取 1.1 读取整个文件 假设我们有一个叫做“hello.txt”的文件,文件内容如下: helloWorld helloPython helloJava 在该文件中,有三行字符串,接下来 ...

  4. [fw]用Kprobes调试(debug)内核

    Kprobes是一种运行时动态调试内核的机制, 你可以用它设置断点并收集调试信息, 甚至改变内核行为. Kprobes分三种, 普通kprobes以及基于普通kprobes的jprobes和kretp ...

  5. pytorch中onehot编码转为普通label标签

    label转onehot的很多,但是onehot转label的有点难找,所以就只能自己实现以下,用的topk函数,不知道有没有更好的实现 one_hot = torch.tensor([[0,0,1] ...

  6. docker概述与安装及运行容器

    传统虚拟化 传统虚拟化步骤 1.安装虚拟化软件以及虚拟化的管理软件 2.创建虚拟机 3.给虚拟机安装os 4.在虚拟机内部不是应用(http.db之类的应用) 传统虚拟化的特点 1.VM与VM之间是完 ...

  7. c# 编程--基础部分补全篇

    C#基础 分支: switch            switch(表达式)                {                    case 具体值1:                ...

  8. 2018-12-25-win2d-图片水印

    title author date CreateTime categories win2d 图片水印 lindexi 2018-12-25 10:37:52 +0800 2018-03-19 08:3 ...

  9. 10.ThreadLocal

    /** * - void set(Object value)设置当前线程的线程局部变量的值. * - public Object get()该方法返回当前线程所对应的线程局部变量. * - publi ...

  10. Python--多态与多态性、绑定方法与非绑定方法

    多态与多态性 多态 多态指的是一类事物有多种形态,(一个抽象类有多个子类,因而多态的概念依赖于继承) 1. 序列类型有多种形态:字符串,列表,元组. s='hello' l=[,,] t=('a',' ...