java 多线程(1) join() / interrupt() 打断sleep() / stop() / run() / 线程停止的方法
2016-01-12 17:23
821 查看
java Thread 类方法
interrupt( ) 很粗暴,尽量不要用,interrupt( ) 打断sleep( ) ,程序如 1
stop( ) 更粗暴,不要用,因为interrupt()起码还有个catch语句块,有个把我打开的资源关闭的机会,你stop是这个线程再也没机会执行了
run()方法一结束,线程就结束。
join() 方法,程序 2
线程停止,最好不要用thread.stop( ),用flag 来判断,对外提供shutdown( )方法,如程序3
程序1:
join( ) 方法,程序2:
程序3:
interrupt( ) 很粗暴,尽量不要用,interrupt( ) 打断sleep( ) ,程序如 1
stop( ) 更粗暴,不要用,因为interrupt()起码还有个catch语句块,有个把我打开的资源关闭的机会,你stop是这个线程再也没机会执行了
run()方法一结束,线程就结束。
join() 方法,程序 2
线程停止,最好不要用thread.stop( ),用flag 来判断,对外提供shutdown( )方法,如程序3
程序1:
package test.java.Thread; import java.util.Date; public class TestInterrupt { public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); try { Thread.sleep(10000);//在哪个线程中,调用sleep,哪个线程睡 }catch (InterruptedException e){} //thread.interrupt(); //谁调用谁被打断。叫做你睡着的时候,我把你打断。10秒过后,主线程不高兴了,一盆凉水泼过去,子线程的sleep函数 //抛InterruptedException 异常 thread.flag = false; //这样就让子线程停止了,记住,轻易不要给人泼凉水(interrupt()),因为你在catch语句块中把自己的业务写进去 //也是一种不好的编程方式。但是可以用,至少比stop() 强.stop()太粗暴了,轻易不要用。 //thread.stop(); //记住也不要调用Thread 的 stop()方法去让子线程停止,因为stop比interrupt 还粗暴。前者是泼一盆凉水, //stop是一根棒子打脑袋上,立刻死掉。因为interrupt()起码还有个catch语句块,有个把我打开的资源关闭的机会,你stop是这个线程再也没机会执行了, } } class MyThread extends Thread{ // boolean flag = true; // public void run(){//不能在这throws InterruptedException 因为这里run()是重写的方法,重写的方法不能抛出与被重写方法不同的异常 while (flag) { //所以这里写throws 不行,只能写try catch System.out.println("==="+new Date()+"==="); try { sleep(1000); } catch (InterruptedException e) { return; //return 则线程结束。所以主线程一执行 thread.interrupt(),则子线程结束。但是这只是演示interrupt方法,以上不是 //让子线程结束最好的方法。因为你这个interrupt方式太粗暴了,你catch 了一个exception,万一人家打开一个资源,没来得及关,怎么办 //如果这种子线程while(true)的,想让子线程停止,怎么办?如程序,直接定义一个flag 变量等于true,你想让他停止, //直接在main 线程中thread.flag 等于false 就可以。这样run()方法就结束了,run()方法一结束,线程就结束。这是一个简单的控制办法 } } } }
join( ) 方法,程序2:
public class TestJoin { public static void main(String[] args) throws UnsupportedEncodingException { MyThread2 t1 = new MyThread2("zi xiancheng"); t1.start(); try{ t1.join(); //把t1 线程和当前线程合并,则这个相当于方法调用了,t1的run()就执行了,执行之后再执行这句后面的语句 }catch(InterruptedException e){ System.out.println("我是main,被interrupt"); } for(int i=0;i<1000;i++) System.out.println("I am main thread"); } } class MyThread2 extends Thread { MyThread2(String s ){// 这个参数是线程名字,没什么用,可以作为一个标识,由本线程的getName()方法去调用 super(s); } public void run(){ for(int i=0;i<10;i++){ System.out.println("I am "+getName()); try{ sleep(1000); }catch(InterruptedException e){ return ; } } } }
程序3:
package test.java.Thread; import java.util.Date; public class TestInterrupt { public static void main(String[] args) throws InterruptedException { MyThread thread = new MyThread(); thread.start(); for(int i=0;i<100;i++){ System.out.println("main thread"+i); } thread.shutDown(); Thread.sleep(10000); System.out.println(thread.getState());//TERMINATED,run 方法一结束,线程就结束 } } class MyThread extends Thread{ boolean flag = true; // public void run(){ int i=0; while (flag==true) { System.out.println(" "+i++); } } public void shutDown(){ flag = false; } }
相关文章推荐
- Java基础学习笔记5
- java.lang.OutOfMemoryError
- 关于java Udp收发数据异常的笔记
- spring.xml等xml文件的注解解读
- 通过Spring @PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
- nested exception is java.lang.NoSuchFieldError: TRACE
- Java Mail(三):JavaMail发送文本邮件换行
- java中Keytool的使用总结
- java之生成不重复的随机数
- springMVC注解驱动
- 【javaMail】【3.多线程发邮件】java mail 多线程发送邮件
- Jqgrid+spring mvc使用心得
- SpringMVC中添加Interceptor拦截器
- java免费发送邮件实现
- java 异常
- struts2常用标签
- Java Web Services (2) - 第2章 启动日志分析
- javaIO详解
- Spring整合Shiro做权限控制模块详细案例分析
- Java并发编程:volatile关键字解析