1.在以前的java版本里面,线程结束提供了stop方法;但是现在已经过时了,不再推荐使用此方法,也就是不再使用这个方法了。主要是因为thread.stop会立即将线程终止,导致代码逻辑不完整。譬如子线程休眠1s之后执行某操作,但是主线程在休眠了0.1s之后子线程就执行了stop方法。导致子线程里面的逻辑不完整。另外此线程持有的锁也会立即释放,导致其他线程可能会使用到不完整的数据。
那么如何停止线程呢?只有一种方法,那就是run方法结束。我们开启多线程执行,代码通常是使用循环结构,最多的就是while循环,所以只要控制住循环,就可以让run方法结束,也就是线程结束。
我们可以设置一个标记,当想要终止线程的时候标记置位即可。
另外一种方法就是借助thread的interrupt方法,这个方法可以让将线程中断标识位置位(中断标识位置为true),线程会不时地检查这个中断标识位,以判断线程标识位是否被置位。可以调用Thread.currentThread().isInterrupted()方法指导线程是否被置位。但是如果线程被阻塞,就无法判断线程中断状态,因为一个线程处于阻塞状态,线程在检测中断标识位时如果发现中断标识位为true,会在阻塞方法调用处抛出InterruptedException异常,并且在抛出异常之前将线程的中断标识位复位,即重新设置为false。所以如果捕获到InterruptedException异常,就需要我们做出相应的操作。
综上所述,一种方法是设置标记;另外一种方法可以使用thread的interrupt方法,同时为了避免阻塞引起的重新置位,可以使用try catch,捕获到了中断异常处,再次调用interrupted方法。当然更好的做法是不使用try捕获,而是抛出异常,让调用者捕获这个异常,做出相应的操作。
网友评论