android中的线程中断小结

       学Android也有些时候了,期间也是一路学习大咖们的技术blog,想着有时间就应该自己整理才能成为自己的知识,ok,第一次写,文笔也并不如何,有不同意见请指正,请轻pen。

       Android开发中实现多线程机制主要有继承自java的Thread类和实现Runnable接口两种方法,而在共享数据访问以及单继承限制方面还是实现Runnable较为便利,具体实现细节,略。言归正传,说到线程中断。

       线程中断分为两种:控制任务流程走向结束和异常中止。

       而线程异常中止也分为两种:强制调用线程对象的stop方法(结果不可预料)以及捕获异常并中断。

       所以,详细的方式其实是三种,下面详细讲解:

       第一种方式:(暴力中断)

               直接调用thread实例的stop()方法,线程直接中止,但会引起不可预料的结果,如:

       thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    while(true){
                        Thread.sleep(1000);
                        Log.d("debug", System.currentTimeMillis()+"");
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }
            }
        });
        thread.start();
       接下来,thread.stop()被调用,app的进程中止。因此,除非特殊的用途,一般不建议调用此方法来中断线程。

第二种方式:(流程控制中断)

        我们知道,在线程运行时调用线程实例的interrupt()方法,当线程处于非阻塞状态时,得到线程状态的isInterrupted()返回true,若以此为循环条件,则线程可正常退出循环,结束线程。

        thread = new Thread(new Runnable() {
		@Override
		public void run() {
			while (!Thread.currentThread().isInterrupted())
				try {
                                      //线程非阻塞
                                     <span style="color:#FF6666;">//Thread.sleep(5000);</span>
					Log.d("debug", System.currentTimeMillis() + "");
				} catch (Exception e) {
					// TODO: handle exception
 				}
		}
	});
	thread.start();
        thread.interrupt()方法被调用,Thread.currentThread().isInterrupted()置true,退出循环,结束线程。

第三种方式:(捕获异常中断)

        同理,当线程处于阻塞状态时,调用thread.interrupt()方法,程序抛出异常,此时在捕获异常时做处理,中断循环,结束线程。

	thread = new Thread(new Runnable() {
		@Override
		public void run() {
			while (!Thread.currentThread().isInterrupted())
				try {
					<span style="color:#FF6666;">Thread.sleep(5000);</span>
					Log.d("debug", System.currentTimeMillis() + "");
				} catch (InterruptedException e) {
					<span style="color:#FF6666;">break;</span>
				}
		}
	});
	thread.start();

最后,说下Future.cancel(mayInterruptIfRunning)方法。据官方的说法,该方法比起thread.interrupt()方法更加安全。因为前者是与线程池一起使用的,不好比较。但有一点,这两个function都无法真正中断任务,只是在线程任务执行过程中插入了中断信号,使Thread.currentThread().isInterrupted()返回值改变,且都受到线程阻塞的限制。

最后的最后,java多线程机制下的阻塞方法(sleep()、wait())内通过不断循环检查isInterrupt的值,随时抛出InterruptedException异常而不改变任务执行。因此,任何执行中的线程,除非暴力中断,其他方法对不可中断任务无效。

OVER



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值