当前位置: 首页 > Linux

深入理解Java中停止线程

时间:2023-04-06 21:05:33 Linux

1.停止线程会带来什么?对于单线程来说,停止单线程就是直接使用关键字return或者break,但是停止多线程的时候,就是让该线程在任务完成前启动另外一个线程,必须放弃当前任务,而这个过程是不可预知的,所以Go必须有所准备。2.了解几种停止线程的方法2.1三个废弃的方法stop(),suspend(),resume()。stop()方法被弃用的原因:不管线程在什么地方执行,一旦停止,就会立即被强行中断,线程持有的所有锁对象都会被释放,一点都不安全。Suspend()和resume()是一对烂兄弟,因为只有其他线程调用resume方法时,他才会释放suspend方法的锁,很容易造成死锁。2.2名字相似的三个方法interrupt()中断线程,interrupted()判断当前线程是否停止,isInterrupted()判断线程是否停止。首先介绍两个名字最接近的方法:interrupted()和isInterrupted()。这两个方法用于测试线程是否被中断。我们看一下原代码:isInterrupted():publicbooleanisInterrupted(){returnisInterrupted(false);}interrupted():publicstaticbooleaninterrupted(){returncurrentThread().isInterrupted(true);}可以可以清楚的看出interrupted()方法是static的,而isInterrupted()是non-static的,但是两者都返回线程是否被中断。  来做个测试,代码如下:复制代码publicclassIs_InterruptextendsThread{@Overridepublicvoidrun(){for(inti=0;i<1000;i++){System.out.println("当前i的值为:"+i);}}publicstaticvoidmain(String[]args){Is_Interruptis_interrupt=newIs_Interrupt();is_interrupt.start();is_interrupt.interrupt();//中断线程System.out.println("线程是否被挂起?"+is_interrupt.interrupted());}}复制代码的输出是:发现线程还没有停止。但是里面还有一个线程是主线程,interrupted()返回的是当前线程的中断状态,那么主线程就是执行这个方法的,当然此时主线程并没有被中断.我们把interrupted()方法改成isInterrupted()试试效果,代码如下:复制代码publicclassIs_InterruptextendsThread{@Overridepublicvoidrun(){for(inti=0;i<1000;i++){系统。out.println("i的当前值为:"+i);}}publicstaticvoidmain(String[]args){Is_Interruptis_interrupt=newIs_Interrupt();is_interrupt.start();is_interrupt.interrupt();//中断线程System.out.println("线程是否被挂起?"+is_interrupt.isInterrupted());}}复制代码的结果如下:意思是线程已经停止了,但是我们用了错误的方法判断为主线程的状态。总结:isInterrupted方法返回调用对象的中断状态,而静态方法interrupted返回当前线程的中断状态。理解了这个误区之后,我们再来看下面的代码:System.out.println(Thread.interrupted());//判断当前线程是否被中断System.out.println(currentThread().isInterrupted());//通过currentThread().isInterrupted()也可以实现同样的目的,}}单线程重复代码输出:这个没问题。那么我们调用了多少次这个被中断的方法呢?复制代码publicclassInterruptTextextendsThread{publicstaticvoidmain(String[]args){System.out.println("mainthreadstarted!");currentThread().interrupt();//中断主线程System.out.println(Thread.interrupted());//判断当前主线程是否被中断上一个线程是否被中断?}复制代码结果:按常理应该返回两次true,但是为什么变成了falsefor第二次?其实中断就是清除状态。当然如果调用两次,它会由true变为flase,但还是中断了,只是isInterrupted没有被清除。interrupt()方法:中断线程3.停止线程3.1异常挂起线程先看一段代码:复制代码publicclassInterruptTextextendsThread{@Overridepublicvoidrun(){try{for(inti=0;i<100000;i++){if(currentThread().isInterrupted()){//如果线程被中断thrownewInterruptedException();//抛出异常}else{System.out.println(i);}}System.out.println("线程未终止");}catch(InterruptedExceptione){e.printStackTrace();}}publicstaticvoidmain(String[]args)throwsException{InterruptTextinterruptText=newInterruptText();中断文本.start();线程.睡眠(100);interruptText.interrupt();}}复制代码结果:异常停止方法的策略是:遇到中断,抛出异常,捕获异常。3.2睡眠期间中断线程代码如下:}}publicstaticvoidmain(String[]args){InterruptText2interruptText2=newInterruptText2();interruptText2.start();//启动线程,但是线程处于休眠状态。喜欢的朋友进群:874811168免费获取资料一份),当前线程放弃所有资源去执行其他任务。但放弃资源的时间无法预测。3.4守护线程守护线程的定义:守护线程是区别于非守护线程的一种特殊线程。当程序中没有非守护线程时,守护线程退出,程序退出。设置守护线程:setDaemon(),如果参数为true,则该线程为守护线程。

最新推荐
猜你喜欢