方法Join()
- 等待线程结束:jion()
- 谦让: yeild()
- 睡眠: sleep()
jion和sleep和yeild之间有什么区别呢?
首先介绍一下jion():
如果想让主线程等待子线程执行完毕之后再继续运行,比如线程处理一个数据,主线程想要获得这个线程的处理结果,因为线程之间是并行的,这个时候就需要用到jion()方法。方向jion()的作用就是等待线程对象销毁。
先来看一段示例代码:
public class MyThread extends Thread {
@Override
public void run(){
try{
int value = (int) (Math.random()*1000);
System.out.println("i will sleep for "+value+" ms");
Thread.sleep(value);
}catch (InterruptedException e){
e.printStackTrace();
}
}
}
public class Test {
public static void main(String[] args) {
try{
MyThread thread = new MyThread();
thread.start();
thread.join();
System.out.println("我想在上面的线程执行结束只会再执行,我成功了!");
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println("================分割线=====================");
MyThread myThread = new MyThread();
myThread.start();
System.out.println("我也想在上面的线程执行完毕之后执行!");
System.out.println("但是我不知道应该sleep多久啊!");
System.out.println("i failed...");
}
}
放上执行结果:
i will sleep for 436 ms
我想在上面的线程执行结束只会再执行,我成功了!
================分割线=====================
我也想在上面的线程执行完毕之后执行!
但是我不知道应该sleep多久啊!
i failed...
i will sleep for 936 ms
这里介绍一下join()的原理,方法jion()具有使线程排队运行的作用,有些类似同步的运行效果。jion和synchronized的区别是:join在内部使用wait()方法进行等待,而synchronized关键字使用对象监视器原理作为同步。
划重点,因为join()使用了wait()所以,join是释放锁的!是释放锁的!
这是join和sleep的主要区别!
然后介绍一下yeild()
yeild()就是简单让线程让出cpu资源,所以yeid()只是一种谦让的方法,因为是谦让,所以他可以刚谦让过,立马就又恢复运行,但是!!!yeild不会释放对象锁!!!!
package page_7;
public class ThreadYieldAndSleepTest implements Runnable {
private int count = 0;// 系统访问次数
@Override
public synchronized void run() {// 通过synchronized实现同步
count++;
try {
if (count == 1) {
/// <注>. sleep 和 yield 都不会释放 <锁资源>。
Thread.yield();
}
} catch (Exception e) {
// TODO: handle exception
}
System.out.println(Thread.currentThread().getName() + "线程: " + "第" + count + "位访客来啦!");
}
public static void main(String[] args) {
ThreadYieldAndSleepTest rd = new ThreadYieldAndSleepTest();
for (int i = 1; i <= 50; i++) {
Thread thread = new Thread(rd, String.valueOf(i));
thread.start();
}
}
}
运行结果为:
1线程: 第1位访客来啦!
50线程: 第2位访客来啦!
49线程: 第3位访客来啦!
48线程: 第4位访客来啦!
47线程: 第5位访客来啦!
......
没有被抢占,所以yeild()不会释放锁!
最后介绍一下sleep
sleep的介绍很多,sleep是不会释放锁的
总结
sleep和yeild 一样不会释放锁
join 会释放锁
sleep和join如果不考虑对象锁的情况下,功能基本一致
方法Join()的更多相关文章
- 方法join()使用详解
在线程的常见方法一节中,已经接触过join()方法的使用. 在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程将早于子线程结束.这时,如果主线程想等子线程执行完成才结束,比 ...
- 进程?线程?多线程?同步?异步?守护线程?非守护线程(用户线程)?线程的几种状态?多线程中的方法join()?
1.进程?线程?多线程? 进程就是正在运行的程序,他是线程的集合. 线程是正在独立运行的一条执行路径. 多线程是为了提高程序的执行效率.2.同步?异步? 同步: 单线程 异步: 多线程 3.守护线程? ...
- python中列表元素连接方法join用法实例
python中列表元素连接方法join用法实例 这篇文章主要介绍了python中列表元素连接方法join用法,实例分析了Python中join方法的使用技巧,非常具有实用价值,分享给大家供大家参考. ...
- Python--day37--多进程中的方法join()
1,多进程中的方法join()的作用: 感知一个子进程的结束,将异步的程序改为同步 #join() import time from multiprocessing import Process de ...
- java 线程方法join的简单总结
虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...
- 数组中的元素 增加push用法 unshift() 方法 和减少pop() 方法 shift() 和其他位置增删 splice() 方法 join() 方法 reverse() 方法 sort() 方法
push用法 push 英 [pʊʃ] 美 [pʊʃ] vt. 推,推动; vt. 按; 推动,增加; 对…施加压力,逼迫; 说服; n. 推,决心; 大规模攻势; 矢志的追求 定义和用法 push( ...
- Java并发编程:Java Thread方法join的简单总结
虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...
- 记录一个python公式罗列的方法 join()方法和map()方法的妙用
题干: 怎样将一个列表中的元素读出,并列出计算式子 比如:[,,,] 输出:+++ = 列表中的元素个数不定 小白和大神的方法: #小白的 numlist=[,,,] sum1='' cal='+' ...
- java线程方法join的总结
虽然关于讨论线程join方法的博客已经很多了,不过个人感觉挺多都讨论得不够全面,所以我觉得有必要对其进行一个全面的总结. 一.作用 Thread类中的join方法的主要作用就是同步,它可以使得线程之间 ...
- pandas按索引插入对应值的处理方法 - join
在工作中遇到一个问题即,实时的车辆数据中,需要将车辆的vid(一个Series)对应上其通用名称,以及车辆用途等信息进行统计. 正常的小规模操作是利用一个循环,查找vid 在另一张vid对应车辆名称用 ...
随机推荐
- Node.js 中监听 redis key 过期事件
It is in fact possible to listen to the “expired” type keyevent notification using a subscribed clie ...
- CSS3中resize属性
说明: resize属性是指定一个元素是否可由用户调整大小的. 语法: resize:none | both | horizontal | vertical none:用户不可一调整元素的尺寸(默认值 ...
- 使用 Struts2 校验器校验用户注册信息的例子
转自:https://blog.csdn.net/jin2005006/article/details/53999562 基于验证框架的输入校验 一.创建一个struts2项目testValidato ...
- 20180209-json&pickle&shelve模块
什么是序列化? 序列化就是把内存里的数据类型转成字符串,以使其能够存储到硬盘中或在网络中传输到远程,因为硬盘和网络传输时只接收bytes 用于序列化的两个模块 1. json,用于字符串和python ...
- centos7 利用mailx发送邮件
当需要服务器定时发送邮件到自己邮箱时,一个邮件服务就很重要了,以下主要是mailx的实现,主要是利用 1.安装mailx 1 yum install mailx -y 2.使用到的配置文件只有一个 ...
- 数据库_PXC群集与存储引擎
1. PXC介绍与群集搭建; 2.数据存储引擎. 一, PXC介绍 1.介绍 PXC(Percona XtraDB Cluster)基于Galara的一台开源软件,应用于解决mysql的高可用集群问题 ...
- squid代理与缓存(下)
squid代理与缓存(下) 6. squid代理模式案例 6.1 squid传统正向代理生产使用案例 6.1.1 squid传统正向代理两种方案 (1)普通代理服务器 作为代理服务器,这是SQUID的 ...
- Linux双网卡绑定bond详解
参考资料: 1.https://blog.csdn.net/shengerjianku/article/details/79221886
- Linux系统基于fork()新进程的创建
作者:严哲璟 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 fork属于系 ...
- spring data mongodb CURD
一.添加 Spring Data MongoDB 的MongoTemplate提供了两种存储文档方式,分别是save和insert方法,这两种的区别: (1)save :我们在新增文档时,如果有一 ...