当前位置: 首页 > news >正文

网站开发公司哪里好wap网站推广方法

网站开发公司哪里好,wap网站推广方法,域名地址查询网,winserver wordpress这是我2021年的第2篇原创文章#xff0c;原汁原味的技术之路尽在Jerrycodes为什么不强制停止如何用 interrupt 停止线程sleep 期间能否感受到中断停止线程的方式有几种总结启动线程需要调用 Thread 类的 start() 方法#xff0c;并在 run() 方法中定义需要执行的任务。启动一… 这是我2021年的第2篇原创文章原汁原味的技术之路尽在Jerrycodes为什么不强制停止如何用 interrupt 停止线程sleep 期间能否感受到中断停止线程的方式有几种总结启动线程需要调用 Thread 类的 start() 方法并在 run() 方法中定义需要执行的任务。启动一个线程非常简单但如果想要正确停止它就没那么容易了。对于实现线程的几种方式可见我的上一篇文章实现线程本质上只有一种方式为什么不强制停止对于 Java 而言最正确的停止线程的方式是使用 interrupt。但 interrupt仅仅起到通知被停止线程的作用。而对于被停止的线程而言它拥有完全的自主权它既可以选择立即停止也可以选择一段时间后停止也可以选择压根不停止。为什么 Java 不提供强制停止线程的能力呢事实上Java 希望程序间能够相互通知、相互协作地管理线程因为如果不了解对方正在做的工作贸然强制停止线程就可能会造成一些安全的问题。比如线程正在写入一个文件这时收到终止信号它就需要根据自身业务判断是选择立即停止还是将整个文件写入成功后停止。如果选择立即停止就可能造成数据不完整不管是中断命令发起者还是接收者都不希望数据出现问题。如何用 interrupt 停止线程while (!Thread.currentThread().isInterrupted()  more work to do) {    do more work}我们一旦调用某个线程的 interrupt() 之后这个线程的中断标记位就会被设置成 true。每个线程都有这样的标记位当线程执行时应该定期检查这个标记位如果标记位被设置成 true就说明有程序想终止该线程。回到源码可以看到在 while 循环体判断语句中首先通过Thread.currentThread().isInterrupt() 判断线程是否被中断随后检查是否还有工作要做。 逻辑表示只有当两个判断条件同时满足的情况下才会去执行下面的工作。public class StopThread implements Runnable {     Override    public void run() {        int count  0;        while (!Thread.currentThread().isInterrupted()  count 1000) {            System.out.println(count    count);        }    }     public static void main(String[] args) throws InterruptedException {        Thread thread  new Thread(new StopThread());        thread.start();        Thread.sleep(5);        thread.interrupt();    }}在 StopThread 类的 run() 方法中首先判断线程是否被中断然后判断 count 值是否小于 1000。这个线程的工作内容很简单就是打印 0~999 的数字每打印一个数字 count 值加 1可以看到线程会在每次循环开始之前检查是否被中断了。接下来在 main 函数中会启动该线程然后休眠 5 毫秒后立刻中断线程该线程会检测到中断信号于是在还没打印完1000个数的时候就会停下来这种就属于通过 interrupt 正确停止线程的情况。sleep 期间能否感受到中断先说结论可以。public class StopDuringSleep {     public static void main(String[] args) throws InterruptedException {        Runnable runnable  () - {            int num  0;            try {                while (!Thread.currentThread().isInterrupted()  num  1000) {                    System.out.println(num);                    num;                    Thread.sleep(1000000);                }            } catch (InterruptedException e) {                e.printStackTrace();            }        };        Thread thread  new Thread(runnable);        thread.start();        Thread.sleep(5);        thread.interrupt();    }}运行后的结果你猜怎么着程序会抛出异常如果 sleep、wait 等可以让线程进入阻塞的方法使线程休眠了而处于休眠中的线程被中断那么线程是可以感受到中断信号的并且会抛出一个 InterruptedException 异常同时清除中断信号将中断标记位设置成 false。这样一来就不用担心长时间休眠中线程感受不到中断了因为即便线程还在休眠仍然能够响应中断通知并抛出异常。但是这样只能相应一次中断信号了怎么办我的业务还没有完成收尾怎么办合理利用好 try/catch我们在实际开发中不能盲目吞掉中断如果不在方法签名中声明也不在 catch 语句块中再次恢复中断而是在 catch 中不作处理我们称这种行为是“屏蔽了中断请求”。如果我们盲目地屏蔽了中断请求会导致中断信号被完全忽略最终导致线程无法正确停止。    try {        Thread.sleep(2000);    } catch (InterruptedException e) {//        此处处理中断异常请求业务收尾    }停止线程的方式有几种void shutdown;boolean isShutdown;boolean isTerminated;boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException;List shutdownNow;下面我们就对这些方法逐一展开。shutdown()调用 shutdown() 方法之后线程池并不是立刻就被关闭因为这时线程池中可能还有很多任务正在被执行或是任务队列中有大量正在等待被执行的任务调用 shutdown() 方法后线程池会在执行完正在执行的任务和队列中等待的任务后才彻底关闭。但这并不代表 shutdown() 操作是没有任何效果的调用 shutdown() 方法后如果还有新的任务被提交线程池则会根据拒绝策略直接拒绝后续新提交的任务。isShutdown()它可以返回 true 或者 false 来判断线程池是否已经开始了关闭工作也就是是否执行了 shutdown 或者 shutdownNow 方法。这里需要注意如果调用 isShutdown() 方法的返回的结果为 true 并不代表线程池此时已经彻底关闭了这仅仅代表线程池开始了关闭的流程也就是说此时可能线程池中依然有线程在执行任务队列里也可能有等待被执行的任务。isTerminated()这个方法可以检测线程池是否真正“终结”了这不仅代表线程池已关闭同时代表线程池中的所有任务都已经都执行完毕了因为我们刚才说过调用 shutdown 方法之后线程池会继续执行里面未完成的任务不仅包括线程正在执行的任务还包括正在任务队列中等待的任务。比如此时已经调用了 shutdown 方法但是有一个线程依然在执行任务那么此时调用 isShutdown 方法返回的是 true 而调用 isTerminated 方法返回的便是 false 因为线程池中还有任务正在在被执行线程池并没有真正“终结”。直到所有任务都执行完毕了调用 isTerminated() 方法才会返回 true这表示线程池已关闭并且线程池内部是空的所有剩余的任务都执行完毕了。awaitTermination()第四个方法叫作 awaitTermination()它本身并不是用来关闭线程池的而是主要用来判断线程池状态的。比如我们给 awaitTermination 方法传入的参数是 10 秒那么它就会陷入 10 秒钟的等待直到发生以下三种情况之一等待期间(包括进入等待状态之前)线程池已关闭并且所有已提交的任务(包括正在执行的和队列中等待的都执行完毕,相当于线程池已经“终结”了,方法便会返回true等待超时时间到后,第一种线程池“终结”的情况始终未发生,方法返回 false等待期间线程被中断,方法会抛出 Interruptedexception异常等待期间(包括进入等待状态之前)线程池已关闭并且所有已提交的任务(包括正在执行的和队列中等待的)都执行完毕相当于线程池已经“终结”了方法便会返回 true等待超时时间到后第一种线程池“终结”的情况始终未发生方法返回 false等待期间线程被中断方法会抛出 InterruptedException 异常。shutdownNow()最后一个方法是 shutdownNow()也是 5 种方法里功能最强大的它与第一种 shutdown 方法不同之处在于名字中多了一个单词 Now也就是表示立刻关闭的意思。在执行 shutdownNow 方法之后首先会给所有线程池中的线程发送 interrupt 中断信号尝试中断这些任务的执行然后会将任务队列中正在等待的所有任务转移到一个 List 中并返回我们可以根据返回的任务 List 来进行一些补救的操作例如记录在案并在后期重试。public List shutdownNow() {     List tasks;final ReentrantLock mainLock  this.mainLock;    mainLock.lock();try {         checkShutdownAccess();        advanceRunState(STOP);        interruptWorkers();        tasks  drainQueue();    } finally {         mainLock.unlock();    }     tryTerminate();return tasks; }源码中有一行 interruptWorkers() 代码这行代码会让每一个已经启动的线程都中断这样线程就可以在执行任务期间检测到中断信号并进行相应的处理提前结束任务。这里需要注意的是由于 Java 中不推荐强行停止线程的机制的限制即便我们调用了 shutdownNow 方法如果被中断的线程对于中断信号不理不睬那么依然有可能导致任务不会停止。总结中断和关闭线程的方式五花八门看起来很相似其实里头大有门道。处理不好可是会导致程序崩溃的。码到这里何不来个在看
http://www.zqtcl.cn/news/63076/

相关文章:

  • 网站数据做面板分析没有网站怎么做cpa广告
  • 广东省城乡建设厅投诉网站受欢迎的商城网站建设
  • 电子商务网站建设报价表刚做的网站为什么搜索不到
  • 桐乡市城市规划建设局网站中企动力网站模板
  • 搜索关键词可以过得网站苏州工业园区gdp
  • 59网站一起做网店普宁山东网站建设公司排名
  • 浙江网站建设广告语网站建设与网络营销
  • 网络优化公司网站代码电商网站建设实训步骤
  • 电子商务网站建设与实践网站访客分析
  • 徐州建设厅网站无锡个人网站制作
  • 桂林漓江景点介绍南宁seo建站
  • 软件外包网站wordpress 考试
  • 合肥网站建设哪里好链交换反应
  • 浅谈你对大学校园网站建设的建议阿里巴巴网站本土化建设
  • 百度商桥要怎么添加到网站公众号平台登录
  • html网站列表怎么做企业建设一个自己的网站多少钱
  • 亚马逊如何做站外促销网站成都防疫最新动态
  • 东莞seo网站排名wordpress商店模板
  • iis怎么做网站互联网行业发展
  • 网站开辟两学一做专栏海淘网站开发
  • 怎么弄免费的php空间做网站徐州手机网站建设
  • 网站开发及服务合同网站建设方案书备案
  • 兰州网站建设托管百度站长工具怎么推广网站
  • 郑州网站seo怎样做自己介绍网站
  • 配资网站建设是什么网页制作工具常见的有哪些
  • 广州网站建设排名一览表不屏蔽的国外搜索引擎
  • 教育学校网站建设外贸商做英文网站的目的
  • 网站备案包括空间内容吗仿煎蛋 wordpress
  • 黑客收徒网站建设技术支持 优府网络太原网站建设
  • 网站制作域名是免费的吗wordpress微语