美文网首页java
java 中优雅的停止线程

java 中优雅的停止线程

作者: spraysss | 来源:发表于2019-05-25 15:47 被阅读0次

方法一 轮询一个volatile的boolean变量

package com.example.stopthread;

public class ThreadStop1 {
     public static class MyThread extends Thread{
         private volatile boolean start=true;
         @Override
         public void run() {
             while(start){
                 doTask();
             }

         }
         private void doTask(){
             System.out.println("do some work");
             try {
                 Thread.sleep(100);
             } catch (InterruptedException e) {
                 e.printStackTrace();
             }
         }
         private void shutDown(){
             start=false;
         }
     }

    public static void main(String[] args) {
        MyThread t1=new MyThread();
        t1.start();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t1.shutDown();
    }
}

方法二 线程中断

package com.example.stopthread;

public class ThreadStop2 {
    public static class MyThread extends Thread{
        @Override
        public void run() {
            while(true){
                try {
                    doTask();
                } catch (InterruptedException e) {
                    System.out.print("receive interrupt ");
                    break;
                }
            }

        }
        private void doTask() throws  InterruptedException{
            System.out.println("do some work");
            Thread.sleep(100);
        }
    }

    public static void main(String[] args) {
        MyThread t1=new MyThread();
        t1.start();
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        t1.interrupt();
    }
}

超时停止

有时候线程在轮询的时候,由于内部执行了一个非常耗时并且阻塞的操作,以至于无法及时的收到外部的中断信号,这样就会出现及时已经对该线程发出了中断信号,但是线程也无法及时停止

这时候可以在执行线程之上再包一层,由外部线程处理器中断,内部线程设为守护线程,那么就可以做到及时响应和停止了

package com.example.stopthread;

public class ThreadStopForce {
    private Thread bootStrapThread;
    private volatile boolean finished=false;
    public void execute(final Runnable task){
        bootStrapThread=new Thread(){
            @Override
            public void run() {
                Thread worker =new Thread(task);
                worker.setDaemon(true);
                worker.start();
                try {
                    worker.join();
                    finished=true;
                } catch (InterruptedException e) {
                    //System.out.println("a");
                    //e.printStackTrace();
                }
            }
        };
        bootStrapThread.start();

    }
    private void shutDown(long time){
        long begin=System.currentTimeMillis();
        while(!finished){
            if(System.currentTimeMillis()-begin>time){
                System.out.println("time out ,showdown force");
                bootStrapThread.interrupt();
                break;
            }else {
                try {
                    bootStrapThread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    public static void main(String[] args) {
        ThreadStopForce threadStopForce=new ThreadStopForce();
        threadStopForce.execute(new Runnable() {
            public void run() {
                //block and busy
                while (true){

                }
            }
        });
        threadStopForce.shutDown(10000);
    }
}

相关文章

  • java 中优雅的停止线程

    方法一 轮询一个volatile的boolean变量 方法二 线程中断 超时停止 有时候线程在轮询的时候,由于内部...

  • 一个简单的带中断策略的Thread用例

    使用: 如何优雅的"停止"一个正在运行的JAVA线程如何正确地停止一个线程?关闭线程的正确方法:“优雅”的中断Ja...

  • 如何正确的中断线程?你的姿势是否正确

    Java停止线程的逻辑(协同、通知) 在Java程序中,我们想要停止一个线程可以通过interrupt方法进行停止...

  • 停止及中断运行的线程

    停止线程的方式 在 Java 中停止线程的方式有三种:1、线程的 run 方法执行到最后,线程正常结束并退出;2、...

  • Java 多线程之线程的创建及其使用

    一、创建线程以及启动线程 二、停止线程 三、线程类中函数详解 一、创建线程以及启动线程 创建线程:Java中创建线...

  • Java多线程(二)

    Java多线程(二) 上一篇“Java多线程(一)”主要讨论的是线程的创建,本章主要讨论停止线程。 1.概述 停止...

  • java多线程--Callable

    **移步[java多线程系列文章]Java多线程(二十二)---LockSupport工具Java 停止线程 一、...

  • java多线程之使用interrupt停止线程的几种方法

    停止线程 停止线程是java多线程开发中很重要的技术点,实际工作中很多业务都有类似的需求,掌握此技术可以对业务中所...

  • java并发之守护线程

    java中有两种线程,用户线程和守护线程用户线程:主线程停止时,用户线程不会停止守护线程:主线程停止时,守护线程也...

  • 优雅的停止线程

    在平常的开发中我们想打断一个正在blocking的线程,或者结束执行任务超时的线程可以通过下面的几种方式优雅的停止...

网友评论

    本文标题:java 中优雅的停止线程

    本文链接:https://www.haomeiwen.com/subject/tigazqtx.html