• 线程的停止退出操作


    1:code

    public class ThreadTest1 extends  Thread{
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		super.run();
    		for(int i=0;i<500000;i++){
    			if(this.interrupted()){
    				System.out.println("已经退出---");
    				break;
    			}
    			System.out.println("--"+i);
    		}
    	}
    
    }
    
    
    
    public static void main(String[] args) {
    		
    		ThreadTest1 th=new ThreadTest1();
    		th.start();
    		
    		try {
    			Thread.sleep(2000);
    			th.interrupt();
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    	
    log:
    --331653
    --331654
    --331655
    --331656
    --331657
    --331658
    已经退出---
    

     2: code     

      和1对比

     

    public class ThreadTest1 extends  Thread{
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		super.run();
    		for(int i=0;i<500000;i++){
    			if(this.interrupted()){
    				System.out.println("已经退出---");
    				break;
    			}
    			System.out.println("--"+i);
    		}
    		System.out.println("如果输出改行-说明线程并没有停止!");
    	}
    
    }
    
    
    
    public static void main(String[] args) {
    		
    		ThreadTest1 th=new ThreadTest1();
    		th.start();
    		
    		try {
    			Thread.sleep(2000);
    			th.interrupt();
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    	
    	
    --332195
    --332196
    --332197
    --332198
    --332199
    已经退出---
    如果输出改行-说明线程并没有停止!
    // 说线程仍然走了for后面的语句。
    

      3: 异常抛出法退出线程

    /****  异常抛出法退出线程 ********/
    
    public class ThreadTest1 extends Thread {
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		super.run();
    		try {
    			for (int i = 0; i < 500000; i++) {
    				if (this.interrupted()) {
    					System.out.println("已经退出---");
    					throw new InterruptedException();
    				}
    				System.out.println("--" + i);
    			}
    			System.out.println("如果输出改行-说明线程并没有停止!");
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    
    
    
    
    
    
    public static void main(String[] args) {
    		
    		ThreadTest1 th=new ThreadTest1();
    		th.start();
    		
    		try {
    			Thread.sleep(2000);
    			th.interrupt();
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    
    	
    	
    	
    	log: 
    --341903
    --341904
    --341905
    --341906
    --341907
    --341908
    --341909
    --341910
    已经退出---
    java.lang.InterruptedException
    	at guoxw.ThreadTest1.run(ThreadTest1.java:13)
    
    	
    

      4:休眠中退出线程

    在休眠中停止线程;
    
    public class ThreadTest2  extends Thread {
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		super.run();
    		try {
    			System.out.println("beagin--");
    			Thread.sleep(20000);
    			System.out.println("end--");
    		} catch (InterruptedException e) {
    			// TODO Auto-generated catch block
    			System.out.println("进入catch-"+this.isInterrupted());
    			e.printStackTrace();
    		}
    	}
    
    }
    
    
    
    
    
    	public static void main(String[] args) {
    		
    		ThreadTest2 th=new ThreadTest2();
    		th.start();
    		
    		try {
    			
    			th.interrupt();
    			
    		} catch (Exception e) {
    			
    			e.printStackTrace();
    		}
    
    	}
    
    
    
    
    
    	
    beagin--
    进入catch-false
    java.lang.InterruptedException: sleep interrupted
    	at java.lang.Thread.sleep(Native Method)
    	at guoxw.ThreadTest2.run(ThreadTest2.java:10)
    	
    

      5:Stop 暴力退出线程

    stop 暴力停止
    	
    	public class ThreadTest3 extends Thread{
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		super.run();
    		while(true){
    			System.out.println("输出信息--");
    			try {
    				Thread.sleep(1000);
    			} catch (InterruptedException e) {
    				// TODO Auto-generated catch block
    				e.printStackTrace();
    				System.out.println("进入catch");
    			}
    		}
    	}
    }
    
    
    
    
    public static void main(String[] args) {
    		
    		ThreadTest3 th=new ThreadTest3();
    		th.start();
    		
    		try {
    			Thread.sleep(6000);
    			th.stop();
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    	
    	
    	
    log:
    输出信息--
    输出信息--
    输出信息--
    输出信息--
    输出信息--
    
    注意:使用stop释放锁会给数据造成不一致性的结果。
    

     6: 使用return 停止线程

     

    public class ThreadTest4  extends Thread{
    
    	@Override
    	public void run() {
    		// TODO Auto-generated method stub
    		super.run();
    		while(true){
    			
    			if(this.isInterrupted()){
    				System.out.println("停止了----");
    				return;
    			}
    			
    			System.out.println("是否继续执行了?");
    		}
    	}
    }
    
    
    
    
    public static void main(String[] args) {
    		
    		ThreadTest4 th=new ThreadTest4();
    		th.start();
    		
    		try {
    			Thread.sleep(6000);
    			th.interrupt();
    			
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    	}
    	
    	
    	
    是否继续执行了?
    是否继续执行了?
    是否继续执行了?
    是否继续执行了?
    停止了----
    

      

  • 相关阅读:
    Qt编译出错:“Cannot find file...... .pro."
    谈论如何有效地保护你的数据
    购书网
    VC非模态对话框创建和销毁
    在GUI程序中使用控制台的两种方法
    fatal error C1010: unexpected end of file while looking for precompiled header directive
    burp抓取手机包
    为firefox添加flash插件
    msfvenom生成linux后门
    kali下操作 Apache2
  • 原文地址:https://www.cnblogs.com/galibujianbusana/p/8620627.html
Copyright © 2020-2023  润新知