用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - java代码库

线程的停止

2015-07-22 作者: 锋客举报

[java]代码库

package fengke.thread;
/**
 * 线程的停止
 * @author 锋客
 * 内容:线程的停止共有三种方法:
 *  1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
 *  2.  使用stop方法强行终止线程(这个方法不推荐使用,因为stop和suspend、resume一样,也可能发生不可预料的结果)。 
 *  3.  使用interrupt方法中断线程。 
 *
 */

public class ThreadStop extends Thread{
	public volatile boolean exit=true;
	@Override
	public void run() {
		while(exit){
		System.out.println(getName()+"线程正在运行....");
		}
		System.out.println("线程结束第一阶段!!!");
	}
	
	public static void main(String[] args) {
		stopThread();
		System.out.println("********stop()*********");
		stopThread2();
		System.out.println("********interrupt()*********");
		stopThread3();
		
		
	}
	//使用标志退出
	public static void stopThread(){
		/*
		 * 1.  使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。
		 * 2.  使用join()方法,会是线程抢先执行完毕,
		 *        可以通过   System.out.println("线程结束第二阶段!!!")
		 *        System.out.println("线程结束第一阶段!!!")
		 *        的位置看出区别
		 * 3.最好使用这种方式结束进程
		 */
		ThreadStop ts = new ThreadStop();
		ts.setName("标志");
		ts.start();
		try {
			sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ts.exit=false;
		try {
			ts.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("线程结束第二阶段!!!");
		System.out.println("***********************");
		
	}
	//使用stop()终止
	public static void stopThread2(){
		
		ThreadStop ts = new ThreadStop();
		ts.setName("stop");
		ts.start();
		try {
			sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ts.stop();
		System.out.println("***********************");
		
	}
	
	/*
	 * 使用interrupt方法
	 * 类似于标志
	 * 注意在终止线程中,最好不能有sleep()等方法,否则有肯能是中断失败
	 * interrupt的定义:
	 * 
	 *     isInterrupted()方法仅仅是检查了当前线程的中断状态,但是不会清除这个状态
	 *     静态方法interrupted()这个方法同样是检测当前线程的中断状态,但是这个方法会产生一个副作用,就是会清除当前线程的中断状态。
	 *     
	 *     Thread.interrupt()  VS  Thread.stop()这两个方法最大的区别在于:
	 *     interrupt()方法是设置线程的中断状态,让用户自己选择时间地点去结束线程;
	 *     而stop()方法会在代码的运行处直接抛出一个ThreadDeath错误,这是一个java.lang.Error的子类。
	 *     所以直接使用stop()方法就有可能造成对象的不一致性。
	 *     
	 *      interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是,在线程受到阻塞时抛出一个中断信号,
	 *      这样线程就得以退出阻塞的状态。更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,
	 *      那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。  如果线程没有被阻塞,
	 *      这时调用interrupt()将不起作用;否则,线程就将得到异常(该线程必须事先预备好处理此状况),接着逃离阻塞状态。  
	 *      线程A在执行sleep,wait,join时,线程B调用A的interrupt方法,的确这一个时候A会有InterruptedException异常抛出来.
	 *      但这其实是在sleep,wait,join这些方法内部会不断检查中断状态的值,而自己抛出的InterruptedException。 
	 *      如果线程A正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态,所以线程A不会抛出InterruptedException,
	 *      而会一直执行着自己的操作.当线程A终于执行到wait(),sleep(),join()时,才马上会抛出InterruptedException.
	 *      若没有调用sleep(),wait(),join()这些方法,或是没有在线程里自己检查中断状态自己抛出InterruptedException的话,
	 *      那InterruptedException是不会被抛出来的.   
	 * 
	 */
	public static void stopThread3(){
		ThreadStopInterrupt ts = new ThreadStopInterrupt();
		ts.setName("interrupt");
		ts.start();	
		try {
			sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		ts.interrupt();
		System.out.println("***********************");
		try {
			sleep(10);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("interrupt方法结束");
	}

}
class ThreadStopInterrupt extends Thread{
	public void run() {
		while(!this.interrupted()){
			System.out.println(getName()+"线程正在运行....");
//			线程中使用sleep()等一些方法会使中断失败
//			try {
//				sleep(1000);
//			} catch (InterruptedException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
		}
		System.out.println(getName()+"线程结束....");
	}
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...