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 ...
随机推荐
- poj1285 Combinations, Once Again(泛化背包)
题目传送门 Combinations, Once Again Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1897 A ...
- java基础之轻松搞定反射
前言 java的名词太古怪.反射白话文解释,就是把一个字符串的类名,实例化,少了个new单词. 反射步骤 准备一个苹果类像这个样子. public class PingGuo { private St ...
- linux-redis-install
安装redis3.2.9 wget cd make 编译完成后,将redis-cli redis-server redis-conf redis-benchmark配置文件复制到usr/redis文件 ...
- Django 与 Flask框架的比较
Django Django恐怕是最有代表性的Python框架了.它是一个遵循MMVC架构模式的开源框架.它的名字来自Django Reinhardt,一个法国作曲家和吉他演奏家,很多人认为他是历史上最 ...
- 【leetcode】1006. Clumsy Factorial
题目如下: Normally, the factorial of a positive integer n is the product of all positive integers less t ...
- PHP rewinddir() 函数
打开一个目录,列出其中的文件,充值目录句柄,重新列出其中的文件,然后关闭: <?php$dir = "/images/"; // Open a directory, and ...
- UNP学习 Unix域协议
Unix域协议并不是一个实际的协议族,它只是在同一台主机上进行客户-服务器通信时,使用与在不同主机上的客户和服务器间通信时相同的API的一种方法. 当客户和服务器在同一台主机上时,Unix域协议是这套 ...
- 【Flutter学习】可滚动组件之ScrollView
一,概述 ScrollView 是一个带有滚动的视图组件. 二,组成部分 ScrollView 由三部分组成: Scrollable - 它监听各种用户手势并实现滚动的交互设计.可滚动Widget都直 ...
- paper 142:SDM算法--Supervised Descent Method
对于face recognition的研究,我是认真的(认真expression,哈哈哈~~~~~~)许久没有写blog了,欢迎一起讨论. SDM(Supvised Descent Method)方法 ...
- HTML中多媒体标签技术说明
在纯文本的HTML页面中加入图片,给原来单调乏味的页面添加生气.HTML语言中利用<IMG>标记插入图片. 1.图片标记<IMG>及其属性 在网站上,网页设计者都使用了大量精心 ...