当前位置: 主页 > JAVA语言

java 终止线程-java 终止线程

发布时间:2023-06-07 22:02   浏览次数:次   作者:佚名

java如何正确停止一个线程图片java 终止线程java 终止线程

java 终止线程_java 终止线程_responseredirect 线程终止

java如何正确停止一个线程如何停止java的线程一直是一个开发多线程程序常遇到的一个问题也有好多同学问过所以今天在这里总结一下希望可以让更多的人知道在java中如何安全的结束一个正在运行的线程在Java的多线程编程中javalangThread类型包含了一些列的方法startstopstopThrowableandsuspenddestroyandresume通过这些方法我们可以对线程进行方便的操作但是这些方法中只有start方法得到了保留那么我们究竟应该如何停止线程呢这里我们介绍两种方法1使用共享变量的方式在这种方式中之所以引入共享变量是因为该变量可以被多个执行相同任务的线程用来作为是否中断的信号通知中断线程的执行publicclassThreadFlagextendsThreadpublicvolatilebooleanexitfalsepublicvoidrunwhileexitpublicstaticvoidmainString[]argsthrowsExceptionThreadFlagthreadnewThreadFlagthreadstartsleep3000主线程延迟3秒threadexittrue终止线程threadthreadjoinSystemoutprintln"线程退出"在上面代码中定义了一个退出标志exit当exit为true时while循环退出exit的默认值为false在定义exit时使用了一个Java关键字volatile这个关键字的目的是使exit同步也就是说在同一时刻只能由一个线程来修改exit的值建议使用如下的方法来停止线程privatevolatileThreadblinkerpublicvoidstopblinkernullpublicvoidrunThreadthisThreadThreadcurrentThreadwhileblinkerthisThreadtrythisThreadsleepintervalcatchInterruptedExceptionerepaint2使用interrupt方法终止线程如果一个线程由于等待某些事件的发生而被阻塞又该怎样停止该线程呢这种情况经常会发生比如当一个线程由于需要等候键盘输入而被阻塞或者调用Threadjoin方法或者Threadsleep方法在网络中调用ServerSocketaccept方法或者调用了DatagramSocketreceive方法时都有可能导致线程阻塞使线程处于处于不可运行状态时即使主程序中将该线程的共享变量设置为true但该线程此时根本无法检查循环标志当然也就无法立即中断这里我们给出的建议是不要使用stop方法而是使用Thread提供的interrupt方法因为该方法虽然不会中断一个正在运行的线程但是它可以使一个被阻塞的线程抛出一个中断异常从而使线程提前结束阻塞状态退出堵塞代码classMyThreadextendsThreadvolatilebooleanstopfalsepublicvoidrunwhilestopSystemoutprintlngetName"isrunning"trysleep1000catchInterruptedExceptioneSystemoutprintln"weekupfromblcok"stoptrue在异常处理代码中修改共享变量的状态SystemoutprintlngetName"isexiting"classInterruptThreadDemo3publicstaticvoidmainString[]argsthrowsInterruptedExceptionMyThreadm1newMyThreadSystemoutprintln"Startingthread"m1startThreadsleep3000Systemoutprintln"Interruptthread"m1getNamem1stoptrue设置共享变量为truem1interrupt阻塞时退出阻塞状态Threadsleep3000主线程休眠3秒以便观察线程m1的中断情况Systemoutprintln"Stoppingapplication"注意在Thread类中有两个方法可以判断线程是否通过interrupt方法被终止一个是静态的方法interrupted一个是非静态的方法isInterrupted这两个方法的区别是interrupted用来判断当前线是否被中断而isInterrupted可以用来判断其他线程是否被中断

java 终止线程_responseredirect 线程终止_java 终止线程