如何正确退出线程
2016-01-17 12:00
411 查看
线程退出的方法有: 1.使用共享变量(shared variable)发出信号,让线程自己退出。 该方法,它给予线程机会进行必要的清理工作,符合线程安全,可以使用。2.使用强制退出方法--Thread.stop();3.使用状态+Interrupt().使用 Thread.Interrupt()或者套接字的close()方法,抛出异常InterruptedException,然后置位退出标志。该方法,符合线程安全,根据阻塞情况分两种情况,(1)Object.wait,Thread.join和Thread.sleep三种方法之一阻塞。则调用 Thread.Interrupt(),抛出抛出异常InterruptedException异常,如果线程没有被阻塞,这时调用interrupt()将不起作用(2)如果是线程在I/O操作进行时被阻塞,如socket.connect(),socket.receive() 等等,则需要调用 socket.close(),方法,抛出SocketException异常
package test; import java.io.DataInputStream; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; public class MyThread extends Thread { private boolean isStop; private Socket mysocket; private DataInputStream dis; private InetSocketAddress isa;// = ; public MyThread( Socket mysocket,InetSocketAddress isa ){ this.mysocket=mysocket; this.isa=isa; } @Override public void run() { System.out.print("测试线程启动\n"); while (!isStop) { try { if (dis!=null) { int size=dis.available(); } mysocket.connect(this.isa,18000);//18s 超时 sleep(11000); } catch (IOException eo) { //mysocket.close() 引起的异常 System.out.print("\nIOException:"+eo.toString()); }catch (InterruptedException e){ //Thread.interrupt() 引起的异常 System.out.print("\n中断异常"+e.toString()); isStop=true; break; }catch (Exception e){ // Exception 包含了上面两种异常 IOException 和InterruptedException System.out.print("\n其他异常"+e.toString()); } } System.out.print("\n测试线程结束\n"); } }
测试方法:
<pre name="code" class="java">public static void main(String [] arges){Socket mysocket =new Socket ();System.out.print("hello word!\n");MyThread thread=new MyThread(mysocket,new InetSocketAddress("192.168.1.1",1002));thread.start();try {Thread.sleep( 13000 );} catch (InterruptedException e) {}/* 测试一*/// thread.interrupt();/* 测试二*/try {mysocket.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
相关文章推荐
- php 密码加密方式
- 关于sqlite断电或者存储空间不足造成的数据文件损坏问题-转
- Android IPC 之AIDL
- 数据库的基本操作
- 天津政府应急系统之GIS一张图(arcgis api for flex)讲解(十三)台风模块
- mysql之临时表【整理】
- Apache常见编译选项-转
- P18 (**) Extract a slice from a list.
- P18 (**) Extract a slice from a list.
- Educational Codeforces Round 2 C.Make Palindrome(贪心)
- 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。
- P1025 数的划分
- Linux下Gcc生成和使用静态库和动态库详解(转)
- constexpr与常量表达式(c++11标准)
- sqlite 交叉编译-转
- 严重: Exception starting filter struts2 java.lang.NullPointerException
- sqlite配置选项
- 关于空调安装时外机支架另收费
- contiki学习笔记---process结构体
- 常用linux命令大全