停止线程之标记法,stop方法以及return方法

本文详细介绍了三种在Java中停止线程的方法:使用flag变量、使用已弃用的stop()方法以及结合interrupt()和return使用。通过代码示例,展示了每种方法的工作原理及其潜在问题。

一:使用falg停止线程

  1. 创建继承Thread类的线程类MyThread.java
      
    package com.kgf.test;
    
    public class MyThread extends Thread {
    
    	private boolean flag = true;
    	
    	@Override
    	public void run() {
    		System.out.println("子线程运行开始===============");
    		int i = 1;
    		while(flag) {
    			try {
    				Thread.sleep(1000);
    				System.out.println(i+"次进入for循环!");
    				i++;
    			} catch (Exception e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	
    	public void setFlag(boolean flag) {
    		this.flag = flag;
    	}
    }
    
  2. 创建测试类
       
    package com.kgf.test;
    
    public class Run {
    
    	public static void main(String[] args) throws InterruptedException {
    		try {
    			MyThread myThread = new MyThread();
    			Thread thread = new Thread(myThread,"子线程");
    			thread.start();
    			Thread.sleep(4000);//主线程4秒后会将thread1的falg置false,那么就会推出循环,子线程就会停止
    			myThread.setFlag(false);
    		} catch (Exception e) {
    			System.out.println("main catch");
    			e.printStackTrace();
    		}
    		System.out.println("==========END================");
    	}
    }
    
  3. 效果
       
  4.  结果分析
       首先根据逻辑,我们可知,首先我们是启动子线程后,main线程会睡眠4秒钟,4秒后,我们会修改
       创建的MyThread对象中的flag变量的值,后面子线程就会退出循环。 
             

二:用stop使线程停止----暴力停止

  1. 简介
           使用stop()方法停止线程是非常暴力的,
    stop方法是过时的,从Java编码规则来说,
     已经过时的方式不建议采用,stop方法会导致代码逻辑不完整,stop方法是一种"恶意" 的
     中断,一旦执行stop方法,即终止当前正在运行的线程,不管线程逻辑是否完整,这是非常危险的,
     stop方法会破坏原子逻辑。如果我们使用stop()方法强制让线程停止则有可能使一些清理性的
     工作得不到完成。另外就是对锁定的对象进行了“解锁”,导致数据得不到同步的处理,出现数据
     不一致的问题。
  2. 代码示例
       ⑴创建一个方法类SynchronizedObject.java
                
    package com.kgf.test;
    
    public class SynchronizedObject {
    
    	private String username = "a";
    	
    	private String password = "aa";
    
    	public String getUsername() {
    		return username;
    	}
    
    	public void setUsername(String username) {
    		this.username = username;
    	}
    
    	public String getPassword() {
    		return password;
    	}
    
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	/**
        *加上了synchronized同步锁 
        */
    	public synchronized void printString(String username,String password) {
    		try {
    			this.username = username;
    			Thread.sleep(100000);
    			this.password = password;
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	
    }
    

       ⑵ 创建继承Thread类的MyThread.java类
              
    package com.kgf.test;
    
    public class MyThread extends Thread {
    
    	private SynchronizedObject object;
    	
    	public MyThread(SynchronizedObject object) {
    		this.object = object;
    	}
    	
    	@Override
    	public void run() {
    		object.printString("b", "bb");
    	}
    }
    

       ⑶创建测试类
             
    package com.kgf.test;
    
    public class Run {
    
    	public static void main(String[] args) throws InterruptedException {
    		try {
    			SynchronizedObject object = new SynchronizedObject();
    			MyThread thread = new MyThread(object);
    			thread.start();
    			Thread.sleep(500);
    			thread.stop();
    			System.out.println(object.getUsername()+" "+object.getPassword());
    		} catch (Exception e) {
    			System.out.println("main catch");
    			e.printStackTrace();
    		}
    		System.out.println("==========END================");
    	}
    }
    

       ⑷效果如下
                

       ⑸结果分析
                由上图的结果可知,由于我们在程序的执行中使用stop()方法,造成了数据的不一致
           性,破坏了程序的原子性,原本要么是a aa或者b bb,但是现在变成b aa这就导致了数据
           的原子性了,可见stop()方法确实是存在缺陷的,所以不建议在程序中使用stop()方法。

三:用return使线程停止

  1. 简介
           将方法interrupt()和return结合使用是可以实现停止线程的效果的,只不过我们
    还是建议使用“抛异常”法来实现线程的停止,因为在catch快中可以对异常的信息进
    行相关的处理,能够更好的控制流程的运行,不至于代码中出现很多个return,造成
    污染。 
  2. 代码示例
     ⑴创建继承Thread的类
             

     ⑵创建测试类
              

     ⑶ 效果
            
                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值