暂停线程执行sleep_yield_join_stop
1.final void join() 调用该方法的线程强制执行完成,其它线程处于阻塞状态,该线程执行完毕,其它线程再执行
public class TestJoin {
public static void main(String[] args) throws InterruptedException {
//主线程
MyThread my=new MyThread();
Thread t=new Thread(my);
Thread t2=new Thread(my);
//启动线程
t.start();
t2.start();
//以下代码为主线程中的循环
for(int i=0;i<5;i++){
if(i==2){
t.join(); //t线程强制执行
}
System.out.println("------------"+Thread.currentThread().getName()+"-------->"+i);
}
}
/**
* 导致调用它的线程进入阻塞状态,而不会导致其它的线程
*
* */
}

main执行到2进入阻塞,等Thread-0和Thread-1执行完毕
--------------------------------------------------------------------------------------------------------------
2.static void sleep(long millis) 使当前正在执行的线程休眠millis毫秒,线程处于阻塞状态
public class MyThread2 implements Runnable {
@Override
public void run() {
try {
System.out.println("MyThread2.run(),线程开始休眠");
Thread.sleep(3000);//休眠3秒
System.out.println("MyThread2.run(),休眠结束");
} catch (InterruptedException e) {
System.out.println("MyThread2.run(),产生异常");
}
}
}
public class TestSleep2 {
/**
* sleep方法会导致线程进入阻塞,写在哪个线程体中就会导致哪个线程进入阻塞状态*/
public static void main(String[] args) throws InterruptedException {
MyThread2 my=new MyThread2();
Thread t=new Thread(my);
//启动线程
t.start();
//以下代码为主线程中的代码
System.out.println("主线程开始休眠");
Thread.sleep(2000);
System.out.println("主线程休眠结束");
}
}

-------------------------------------------------------------------------------------------------------------------
3.static void yield() 当前正在执行的线程暂停一次(礼让),允许其他线程执行,不阻塞,线程进入就绪状态,如果没有其他等待执行的线程,这个时候当前线程就会马上恢复执行
public class MyThread3 implements Runnable {
@Override
public void run() {
for(int i=0;i<5;i++){
if(i==2){
Thread.yield();//i==2时礼让一次
System.out.println("当前线程:"+Thread.currentThread().getName()+"线程礼让一次");
}
System.out.println("i="+i);
}
}
}
public class TestYield {
public static void main(String[] args) {
MyThread3 my=new MyThread3();
new Thread(my).start();//启动线程
//主线程中的循环
for(int i=0;i<5;i++){
if(i==3){
Thread.yield();//i==3 主线程礼让一次
System.out.println(Thread.currentThread().getName()+"线程礼让一次");
}
System.out.println(Thread.currentThread().getName()+"------------"+i);
}
}
}

--------------------------------------------------------------------------------------------------
4.final void stop() 强迫线程停止执行,已过时,不推荐使用
public class MyThread4 implements Runnable {
@Override
public void run() {
for(int i=0;i<5;i++){
System.out.println("i="+i);
}
}
}
public class TestStop {
public static void main(String[] args) {
MyThread4 my=new MyThread4();
Thread t=new Thread(my);
t.start();//启动线程
//主线程中的循环
for(int i=0;i<5;i++){
if(i==2){
t.stop(); //已过时,不建议使用
}
System.out.println(Thread.currentThread().getName()+"--->"+i);
}
}
}

总结
1.sleep:
不会释放锁,Sleep时别的线程也不可以访问锁定对象。
2.yield:
让出CPU的使用权,从运行态直接进入就绪态。让CPU重新挑选哪一个线程进入运行状态。
3.join:
当某个线程等待另一个线程执行结束后,才继续执行时,使调用该方法的线程在此之前执行完毕,也就是等待调用该方法的线程执行完毕后再往下继续执行
暂停线程执行sleep_yield_join_stop的更多相关文章
- Qt中暂停线程的执行
在线程中定义一个信号量 QMutex pause; 把run()函数中循环执行的部分用信号量pause锁住: void run() { while(1) { pause.lock(); //循环执行的 ...
- Qt中暂停线程的执行(利用QMutex,超级简单明了)
在线程中定义一个信号量: QMutex pause;把run()函数中循环执行的部分用信号量pause锁住: void run() { while(1) { pause.lock(); //循环执行的 ...
- Qt中暂停线程的执行(主线程和工作线程共用一把锁,一旦主线程将它锁上,工作线程就无法运行了,这也是一个办法)
在线程中定义一个信号量: QMutex pause; 把run()函数中循环执行的部分用信号量pause锁住: void run() { while(1) { pause.lock ...
- interrupted()和isInterrupted()比较+终止线程的正确方法+暂停线程
interrupted():测试当前线程[运行此方法的当前线程]是否已经是中断状态,执行后具有将状态标志清除为false的功能. isInterrupted():测试线程对象是否已经是中断状态,但不清 ...
- netframework中等待多个子线程执行完毕并计算执行时间
本文主要描述在.netframework中(实验环境.netframework版本为4.6.1)提供两种方式等待多个子线程执行完毕. ManualResetEvent 在多线程中,将ManualRes ...
- java暂停线程
暂停线程 本节介绍两个被废弃的用于线程暂停和恢复的方法suspend().resume().主要探究废弃原因,强调线程的安全性.主要有两个原因 原因1: suspend().resume()使用不当, ...
- Java多线程--让主线程等待子线程执行完毕
使用Java多线程编程时经常遇到主线程需要等待子线程执行完成以后才能继续执行,那么接下来介绍一种简单的方式使主线程等待. java.util.concurrent.CountDownLatch 使用c ...
- java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的 ...
- 驱动插ring3线程执行代码
近日有在写一个小东西 需要在内核态中运行一个WIN32程序 之前提到的插入APC可以满足部分要求 但是一到WIN7 x86平台下就崩溃了WIN7下只能插入第三方的进程 一插入系统进程就崩溃,但是这样满 ...
随机推荐
- 微信小程序开发BUG经验总结
摘要: 常见的微信小程序BUG! 小程序开发越来越热,开发中遇到各种各样的bug,在此总结了一些比较容易掉进去的坑分享给大家. 1. new Date跨平台兼容性问题 在Andriod使用new Da ...
- expressjs项目里使用npm run dev,实现热更新
只需要在package.json文件里添加一句代码 "dev": "supervisor -i ./views ./bin/www" 添加的位置如上图所示, 然 ...
- React-classnames库
今天在项目中看到了大佬引入了classnames,之前没用过所以去搜了搜,感觉还真的是挺好用的,搜到一篇很不错的文章,跟原创作者交流了一下就转载过来了! 下面废话不多说,我们直接来看文章吧 首先我们我 ...
- python之递归与二分法
1. 递归 自己调用自己 递归的入口(参数) 和 出口(return) 树形结构的遍历 import os def func(lujing, n): lst = os.listdir(lujing) ...
- Five Android layouts
线性布局: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:an ...
- Appium初识
一. Appium工作原理 基本工作流程如下: Appium提供了一套web服务,Appium起一个Server(4723端口),用于与脚本client通信. server接收web driver(即 ...
- 洗礼灵魂,修炼python(38)--面向对象编程(8)—从算术运算符进一步认识魔法方法
上一篇文章了解了魔法方法,相信你已经归魔法方法至少有个概念了,那么今天就进一步的认识魔法方法.说这个之前,大脑里先回忆一下算术操作符. 什么是算术操作符?忘记没有?忘记了的自己倒回去看我前面的博文或者 ...
- java解析复杂json:JSONObject 和 JSONArray的使用
在正式解析之前,我们需要下载解析Json所需要的jar包,一共有7个. 下载地址如下:https://download.csdn.net/download/zai_xia/10374080 大家也可以 ...
- sql server递归
with cte as ( select belongsAgent from [QPProxyDB].[dbo].[BS_ProxyInfo] where ProxyID = @ProxyID uni ...
- AspNetCore2 Hangfire定时任务
Hangfire 是一个简单的用于.net及.net core 应用程序,通过数据库持久化,定时执行后台任务的组件 1.通过NuGet安装Hangfire 2.在Startup.cs文件的Config ...