zoukankan      html  css  js  c++  java
  • java线程取消方式

    JAVA任务取消方式一般有2种
    第一种设置某个取消标志,任务定期查看该标志,这种方式存在任务取消并不能保证任务立即取消,更糟糕的是有可能任务永远不会结束
    第二种是利用的中断机制,JVM并不能保证阻塞方法检测到中断的速度,但是实际中还是非常快的。
    实例一(使用取消标志,会发现取消的任务还执行中,只有执行完再次检测标志任务才取消)
    任务不断获取下一个素数,在每次获取素数利用sleep 保证获取素数时间大约10s

    package org.thread;
    
    import java.math.BigInteger;
    import java.util.ArrayList;
    import java.util.List;
    
    public class PrimeGenerator extends Thread {
    
        private final List<BigInteger> primes=new ArrayList<BigInteger>();
        private volatile boolean cancelled;
        @Override
        public void run() {
            // TODO Auto-generated method stub
            BigInteger p=BigInteger.ONE;
            while(!cancelled){
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                p=p.nextProbablePrime();
                synchronized (this) {
                    primes.add(p);
                }
            }
            
        }
        public void cancell(){cancelled=true;};
        public synchronized List<BigInteger> get(){
            return new ArrayList<BigInteger>(primes);
        }
    
    }

    测试程序中在启动获取素数的线程后,1s后取消获取素数线程,结果可以看出,线程真正结束是在9s后,结论利用取消标志不能保证线程立即结束或结束。

    package org.thread;
    
    public class InterruptTest {
    
        public static void main(String[] args) {
            PrimeGenerator t=new PrimeGenerator();
    //        PrimeGenerator1 t=new PrimeGenerator1();
            t.start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            t.cancell();
            long start=System.currentTimeMillis();
            long end=0;
            while(t.isAlive()){
                 end=System.currentTimeMillis();
            }
            System.out.println(end-start);
        }
    
    }

    实例 二(使用中断取消,会发现取消的任务很快就结束)
    任务不断获取下一个素数,在每次获取素数利用sleep 保证获取素数时间大约10s

    package org.thread;
    
    import java.math.BigInteger;
    import java.util.ArrayList;
    import java.util.List;
    
    public class PrimeGenerator1 extends Thread{
    
        private final List<BigInteger> primes=new ArrayList<BigInteger>();
        @Override
        public void run() {
            // TODO Auto-generated method stub
            BigInteger p=BigInteger.ONE;
            while(!Thread.currentThread().isInterrupted()){
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    Thread.currentThread().interrupt();
                    e.printStackTrace();
                }
                p=p.nextProbablePrime();
                synchronized (this) {
                    primes.add(p);
                }
            }
            
        }
        public void cancell(){interrupt();};
        public synchronized List<BigInteger> get(){
            return new ArrayList<BigInteger>(primes);
        }
    
    }

    测试程序中在启动获取素数的线程后,1s后取消获取素数线程,结果可以看出,线程可以立即结束。

    package org.thread;
    
    public class InterruptTest {
    
        public static void main(String[] args) {
    //        PrimeGenerator t=new PrimeGenerator();
            PrimeGenerator1 t=new PrimeGenerator1();
            t.start();
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            t.cancell();
            long start=System.currentTimeMillis();
            long end=0;
            while(t.isAlive()){
                 end=System.currentTimeMillis();
            }
            System.out.println(end-start);
        }
    
    }
  • 相关阅读:
    分享Silverlight/WPF/Windows Phone一周学习导读(12月13日12月19日)
    分享Silverlight/WPF/Windows Phone一周学习导读(12月20日12月26日)
    关注Silverlight的未来 推荐注册微软Silverlight FireStarter大会
    Silverlight for Windows Phone Toolkit升级 新增四个控件
    分享Silverlight新鲜事(11月15日21日) PDC 10 Downloader
    分享Silverlight/WPF/Windows Phone一周学习导读(11月22日28日)
    微软副总裁Bob Muglia对Silverlight的公开道歉信
    分享Silverlight/WPF/Windows Phone一周学习导读(11月29日12月5日)
    [转]diff和patch
    Linux查看进程的所有子进程和线程
  • 原文地址:https://www.cnblogs.com/xiongmaotailang/p/5239079.html
Copyright © 2011-2022 走看看