Java实现线程的暂停和恢复的示例详解
问题思路
在Java中,线程的暂停和恢复可以通过Thread类的interrupt方法实现。需要注意的是,interrupt方法并不会立即停止线程,而是会设置一个中断标记,你需要在你的线程中适当地响应这个中断。
以下是一个简单的示例:
问题答案
public class MyThread extends Thread { private volatile boolean isInterrupted = false; @Override public void run() { while (!isInterrupted) { // 线程正在执行的任务... } } public void interruptThread() { isInterrupted = true; } public void resetInterrupt() { isInterrupted = false; } }
在这个例子中,我们创建了一个继承自Thread的类,并添加了一个isInterrupted标志来跟踪线程是否被中断。在run方法中,我们检查这个标志,如果它被设置为true,那么我们就退出循环,线程就会结束。
你可以通过调用interruptThread方法来中断线程,并通过调用resetInterrupt方法来重置中断状态。需要注意的是,当线程被中断时,它会抛出InterruptedException,你需要在你的代码中处理这个异常。
其他方法
自定义线程类(MyThread)
package com.example.wangjun.myapplication; import android.util.Log; public class MyThread extends Thread { private final Object lock = new Object(); private boolean pause = false; /** * 调用该方法实现线程的暂停 */ void pauseThread(){ pause = true; } /* 调用该方法实现恢复线程的运行 */ void resumeThread(){ pause =false; synchronized (lock){ lock.notify(); } } /** * 这个方法只能在run 方法中实现,不然会阻塞主线程,导致页面无响应 */ void onPause() { synchronized (lock) { try { lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } } @Override public void run() { super.run(); int index = 0; while(true){ while (pause){ onPause(); } try { System.out.println(index); Thread.sleep(50); ++index; }catch (Exception e){ e.printStackTrace(); break; } } } }
上面代码中,有注释,其实大家应该都看得懂,那么主要是我们使用同步锁synchronized对Objecy类型的lock进行同步,并在OnPause()方法中进行wait()方法,线程等待,又在resumeThread()方法中进行了解锁notify(),所以我们就能进行线程的暂停和继续的操作了
方法的调用
MyThread my = new MyThread(); Thread thread = new Thread(my); thread.start(); try { sleep(1000); my.pauseThread(); sleep(5000); my.resumeThread(); } catch (InterruptedException e) { e.printStackTrace(); }
出现的结果,会在前一秒内疯狂自增,之后在听五秒后,又开始继续自增;
最后
以上就是Java实现线程的暂停和恢复的示例详解的详细内容,更多关于Java线程暂停和恢复的资料请关注脚本之家其它相关文章!
相关文章
解决Hmily与Feign冲突报错 NullPointerException的问题
这篇文章主要介绍了解决Hmily与Feign冲突报错 NullPointerException的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-11-11Mybatis-Plus处理Mysql Json类型字段的详细教程
这篇文章主要给大家介绍了关于Mybatis-Plus处理Mysql Json类型字段的详细教程,Mybatis-Plus可以很方便地处理JSON字段,在实体类中可以使用@JSONField注解来标记JSON字段,同时在mapper.xml中使用json函数来操作JSON字段,需要的朋友可以参考下2024-01-01Spring Cloud集成Nacos Config动态刷新源码剖析
这篇文章主要为大家介绍了Spring Cloud集成Nacos Config动态刷新源码剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-08-08
最新评论