join(long)方法和sleep(long)方法的比较
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)方法的比较的更多相关文章
- $(document).ready()即$()方法和window.onload方法的比较
以浏览器装载文档为例,我们都知道在页面完毕后,浏览器会通过JavaScript为DOM元素添加事件.在常规的JavaScript代码中,通常使用window.onload方法,而在jQuery中,使用 ...
- Server.Transfer方法,Server.Execute方法和Response.Redirect方法有什么异同
(1)Server.Transfer方法: Server.Transfer("m2.aspx");//页面转向(服务器上执行). 服务器停止解析本页,保存此页转向前的数据后,再使页 ...
- java——多线程——单例模式的static方法和非static方法是否是线程安全的?
单例模式的static方法和非static方法是否是线程安全的? 答案是:单例模式的static方法和非static方法是否是线程安全的,与单例模式无关.也就说,如果static方法或者非static ...
- synchronized 修饰在 static方法和非static方法的区别
Java中synchronized用在静态方法和非静态方法上面的区别 在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法.也可以synchroniz ...
- $(document).ready()方法和window.onload()方法
$(document).ready()方法和window.onload()方法 $(document).ready()方法是JQuery中的方法,他在DOM完全就需时就可以被调用,不必等待这些元素关联 ...
- Html.Partial方法和Html.RenderPartial方法
分布视图 PartialView 一般是功能相对独立的,类似用户控件的视图代码片段,可以被多个视图引用,引用方式如下. 1,Html.Partial方法和Html.RenderPartial方法 静态 ...
- tornado的IOLoop.instance()方法和IOLoop.current()方法区别
在使用tornado时,经常有人疑惑IOLoop.instance()方法和IOLoop.current()方法的区别是什么. IOLoop.instance() 返回一个全局 IOLoop实例. 大 ...
- 【转载】C#中double.TryParse方法和double.Parse方法的异同之处
在C#编程过程中,double.TryParse方法和double.Parse方法都可以将字符串string转换为double类型,但两者还是有区别,最重要的区别在于double.TryParse方法 ...
- 【转载】 C#中decimal.TryParse方法和decimal.Parse方法的异同之处
在C#编程过程中,decimal.TryParse方法和decimal.Parse方法都可以将字符串string转换为decimal类型,但两者还是有区别,最重要的区别在于decimal.TryPar ...
随机推荐
- Vue小白篇 -Vue 的模板语法
可以插入任何你想插入的内容,除了 if-else if-else用三元运算符代替 <div id="box"> <!--模板语法--> <h2> ...
- 2018-11-3-如何使用-Telegram
title author date CreateTime categories 如何使用 Telegram lindexi 2018-11-03 10:12:12 +0800 2018-02-21 1 ...
- go语言从例子开始之Example4.常量
Go 支持字符.字符串.布尔和数值 常量 . package main import "fmt" import "math" const 用于声明一个常量. c ...
- logback-paycore.xml 日志配置
<?xml version="1.0" encoding="UTF-8"?><configuration> <property n ...
- 微信小程序学习一 微信小程序的四个基本文件
微信小程序有四种类型的文件 js 类型文件 小程序的逻辑代码文件 小程序对js es6的处理比较友好,基本上我们的es6语法都需要使用babel插件去转化成es5(具体是什么原因,自己可以去了解一下) ...
- poj 2104 无修改主席树
题目大意: 求序列的区间第k大 基本思路: 因为我根本就没有思路,知道这是主席树,我就去学了下,在b站上看了uestc的教学视频,然后看了一篇博客,博客http://www.cnblogs.com/E ...
- PHP filter_var() 函数
定义和用法 filter_var() 函数通过指定的过滤器过滤一个变量. 如果成功,则返回被过滤的数据.如果失败,则返回 FALSE. 语法 filter_var(variable, filter, ...
- SPOJ - VLATTICE (莫比乌斯反演)
Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many latt ...
- java 京东登录
package org.rx.service.media; import io.netty.channel.Channel; import io.netty.handler.codec.http.Ht ...
- numpy 中文手册
https://yiyibooks.cn/xx/NumPy_v111/user/index.html