暂停线程执行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下只能插入第三方的进程 一插入系统进程就崩溃,但是这样满 ...
随机推荐
- 在WindowsPhone开发中使用MVVM设计模式
相信.NET程序员多多少少都听说过MVVM的设计模式,对于一个大一点的项目来说,使用这种设计模式无疑是一种不错的选择, 它提高了程序的可维护性,降低了耦合度,可以实现代码的重用,方便独立开发和进行测试 ...
- TurboLinux系统管理习题一
TurboLinux系统管理习题一 1. 使用vi编辑文本只读时,强制存盘并退出的命令是?(单选题)A :w! B :q! C :wq! D :e!答案 ...
- (网页)Java程序员们最常犯的10个错误(转)
转自CSDN: 1.将数组转化为列表 将数组转化为一个列表时,程序员们经常这样做: List<String> list = Arrays.asList(arr); Arrays.asLis ...
- 记录定时任务的一个错误:crontab 中使用"%"的问题
最近工作需要,需要定时执行命令文件,并且把执行的日志重定向输出到以日期命名的文件中,命令如下: /bin/bash /data/shell/merge.sh &>> /data/s ...
- android recovery 升级之USB设备挂载
Recovery升级过程,通常会从两个地方获取升级包update.zip升级,一般在线升级,会把升级包下载到cache分区,本地升级会从usb或者tf卡中升级.本文讨论下,本地USB升级时,无法挂载U ...
- [20180327]行迁移与ITL浪费.txt
[20180327]行迁移与ITL浪费.txt --//生产系统遇到的一个问题,增加一个字段到表结构,修改数据字典,导致出现行迁移,而更加严重的是没有修改pctfree值,--//以后的业务操作,依旧 ...
- [SQL SERVER] The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON. (Microsoft SQL Server, Error: 15128)
The CHECK_POLICY and CHECK_EXPIRATION options cannot be turned OFF when MUST_CHANGE is ON. (Microsof ...
- PL/SQL 删除主键 ORA-02443: 无法删除约束条件-不存在的约束条件
在PL/SQL developer中删除一个表的主键,然后把另外一个字段设置成主键,删除的过程中报错:ORA-02443 我遇到这个问题出现的背景是: alter table saleqtya dro ...
- Head First Android --- Enable USB debugging on your device
1. Enable USB debugging on your device On your device, open “Developer options” (in Android 4.0 o ...
- Python如何输出带颜色的文字方法
我们在使用python运维与开发的过程中,经常需要打印显示各种信息.海量的信息堆砌在控制台中,就会导致各种信息都显示在一起,降低了重要信息的可读性.这时候,如果能给重要的信息加上差异的字体颜色,那么就 ...