暂停线程执行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下只能插入第三方的进程 一插入系统进程就崩溃,但是这样满 ...
随机推荐
- Java 内部类的简单介绍
内部类的三种分类(成员内部类,局部内部类,匿名内部类) 1.成员内部类 (类似于成员变量和成员方法) 在类的外部类的方法中去调用内部类 输出结果: 另一种直接在别的类中使用内部类,不过需要先创建外部 ...
- Js调试中不得不知的Console
在js调试中,大部分的前端人员都是采用console.log()方法来打印出调试的数据,但是很多人都不知道console这个对象有很多很实在的方法,本文就来介绍一下这些方法的使用. 一.console ...
- VUE 实现复制内容到剪贴板功能
注: 依赖第三方插件 clipboard 一.安装插件 npm install vue-clipboard2 --save 二.全局注入(main.js) import VueClipboard fr ...
- Android事件总线(一)EventBus3.0用法全解析
前言 EventBus是一款针对Android优化的发布/订阅事件总线.简化了应用程序内各组件间.组件与后台线程间的通信.优点是开销小,代码更优雅,以及将发送者和接收者解耦.如果Activity和Ac ...
- java设计模式学习
每次面试都需要看设计模式,每次都很好的理解了,但是实际开发中没有应用总是忘记.现在把它汇总一下. 二十三种设计模式 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模 ...
- solr-query
解释: 1.query:获取全部数据的SQL 2.deltaImportQuery:获取增量数据时使用的SQL 3.deltaQuery:获取pk的SQL 4.parentDeltaQuery:获取父 ...
- datagridview 行高列宽的自动设置
1) 设定行高和列宽自动调整 [C#]// 设定包括Header和所有单元格的列宽自动调整 DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSi ...
- 17LaTeX学习系列之---LaTeX的版面设计
目录 目录 前言 (一)基础知识 1.纸张大小的设置 2.边距的设置 3.页眉页脚的设置 4.横分割线的设置 5.行间距与段间距 (二)实例 1.源代码 2.输出效果: 目录 本系列是有关LaTeX的 ...
- SAP SQVI 快速浏览器
SQVI可向SQL一样连接多个表浏览数据. 1.输入T-CODE:SQVI. 2.新建一个新查询case 输入CASE 名.点击新建,在弹出的窗口中输入标题,在数据源中可选择单个表查询,或者选择表连接 ...
- Unity3d 协程(IEnumerator)范例
using UnityEngine; using System.Collections; public class Test : MonoBehaviour { IEnumerator Start ( ...