Thread.stop方法可能中断线程,但不安全,此方法都不会用上,快被淘汰了
对线程中的 join, wait, sleep的阻塞进行中断,使用Thread.interrupt()方法退出阻塞, 抛出InterruptedException异常
package com.longshine.nio.test; //中断线程 public class ThreadTest { static class TmpThread extends Thread{ boolean started = true; public void run(){ while(started){ System.out.println("线程进行中"); try { sleep(10 * 10000); } catch (InterruptedException e) { } } System.out.println("线程已中断"); } public void stopThead(){ started = false; this.interrupt(); } } public static void main(String[] args) throws Exception{ TmpThread tt = new TmpThread(); tt.start(); Thread.sleep(1000); tt.stopThead(); } }
中断IO阻塞 interrupt方法不管用 了,可使用关闭IO的方法中止阻塞,如Socket的InputStream的read()方法,调用read()后关闭Socket,抛出IOException
package com.longshine.nio.test; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.net.Socket; import java.net.SocketTimeoutException; public class IOThreadTest { public static void main(String[] args) throws Exception{ new Server().start(); new Thread(){ public void run(){ try { new IOThreadTest().work(); } catch (Exception e) { } } }.start(); Thread.sleep(2000); socket.close(); } private static volatile Socket socket; public void work() throws Exception{ socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1",8000)); System.out.println("连接服务器成功"); //读数据10秒后超时 socket.setSoTimeout(10000); System.out.println("读取数据中"); try{ socket.getInputStream().read(); } catch(SocketTimeoutException e){ System.out.println("超时中断"); } catch(IOException e){ System.out.println("线程中断"); } } private static class Server extends Thread{ public void run(){ try { startServer(); } catch (Exception e) { e.printStackTrace(); } } public void startServer() throws Exception{ ServerSocket serverSocket = new ServerSocket(); serverSocket.bind(new InetSocketAddress(8000)); System.out.println("服务启动"); serverSocket.accept(); System.out.println("客户端接入"); } } }