暂停线程执行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下只能插入第三方的进程 一插入系统进程就崩溃,但是这样满 ...
随机推荐
- ASP.NET MVC4分页Site.CSS
ASP.NET MVC 4 的基础分页的CSS样式: body { font-family: Calibri,Georgia,"Times New Roman"; margin:; ...
- php文件与HTML页面的数据交互
注意:首先需要保证本地配置了php开发环境,如WAMP开发环境 WAMP配置:https://www.cnblogs.com/shiyiaccn/p/9984579.html php获取HTML页面返 ...
- python基础之数据的三大结构
python的三大数据结构 1.顺序 2.分支 3.循环 # if语句联系# 如果age小于18岁,则打印信息“未成年”age = 17if age <= 18: print("未成年 ...
- 【代码笔记】Web-HTML-列表
一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- form的重置reset
HTML中Form表单的reset方法被用来重置用户所输入的内容,以前一直误以为其是单纯的将input等输入项中的值清空. 但实际上不是这样的,reset方法的本质是将input等输入项中的内容还原为 ...
- Android开发常用的一些功能列表(转)
文章来源:http://www.cnblogs.com/netsql/archive/2013/03/02/2939828.html 1.软件自动更新下载,并提示 2.软件登录注册,以及状态保存 3. ...
- Python 会是我们的未来吗?
Python 热度激增 根据 Stack Overflow 的一项调查显示,Python 不仅在专业领域的使用率得到增长,在普通开发上的使用率也有所提升,有 40% 的受访者表示他们现在正在使用 Py ...
- (网页)the server responded with a status of 403 (Forbidden)
403跨域问题.看一下要访问的url.
- 从零自学Java-10.充分利用现有对象
1.超类和子类的设计:2.建立继承层次:3.覆盖方法. 程序StringLister:使用数组列表和特殊的for循环将一系列字符串按字母顺序显示到屏幕上.这些字符串来自一个数组和命令行参数 packa ...
- 用Python实现数据结构之树
树 树是由根结点和若干颗子树构成的.树是由一个集合以及在该集合上定义的一种关系构成的.集合中的元素称为树的结点,所定义的关系称为父子关系.父子关系在树的结点之间建立了一个层次结构.在这种层次结构中有一 ...