- 浏览: 1484214 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (419)
- XMPP (19)
- Android (180)
- Java (59)
- Network (4)
- HTML5 (13)
- Eclipse (9)
- SCM (23)
- C/C++ (4)
- UML (4)
- Libjingle (15)
- Tools&Softwares (29)
- Linphone (5)
- Linux&UNIX (6)
- Windows (18)
- Google (10)
- MISC (3)
- SIP (6)
- SQLite (5)
- Security (4)
- Opensource (29)
- Online (2)
- 文章 (3)
- MemoryLeak (10)
- Decompile (5)
- Ruby (1)
- Image (1)
- Bat (4)
- TTS&ASR (28)
- Multimedia (1)
- iOS (20)
- Asciiflow - ASCII Flow Diagram Tool.htm (1)
- Networking (1)
- DLNA&UPnP (2)
- Chrome (2)
- CI (1)
- SmartHome (0)
- CloudComputing (1)
- NodeJS (3)
- MachineLearning (2)
最新评论
-
bzhao:
点赞123!
Windows的adb shell中使用vi不乱码方法及AdbPutty -
wahahachuang8:
我觉得这种东西自己开发太麻烦了,就别自己捣鼓了,找个第三方,方 ...
HTML5 WebSocket 技术介绍 -
obehavior:
view.setOnTouchListenerview是什么
[转]android 一直在最前面的浮动窗口效果 -
wutenghua:
[转]android 一直在最前面的浮动窗口效果 -
zee3.lin:
Sorry~~
When I build "call ...
Step by Step about How to Build libjingle 0.4
http://blog.csdn.net/sapphiron/article/details/3018053
PART.1 无法中断的线程
一个无法中断的线程的例子。
- public class UninterruptableThread
- {
- @SuppressWarnings ( "deprecation" )
- public static void main(String[] args) throws Exception
- {
- Thread th = new Thread( new TestRunnable());
- // 启动线程
- System.out.println( "main: start thread." );
- th.start();
- // 等待2秒
- Thread.sleep( 2000 );
- // 中断线程
- System.out.println( "main: interrupt thread." );
- th.interrupt();
- // 等待2秒
- Thread.sleep( 2000 );
- // 停止线程
- System.out.println( "main: stop thread." );
- th.stop();
- }
- private static class TestRunnable implements Runnable
- {
- @Override
- public void run()
- {
- System.out.println( "Thread started." );
- while ( true )
- {
- // 避免由于while(true)导致编译失败。
- if ( false ) break ;
- }
- // 清理工作
- System.out.println( "Thread ended." );
- }
- }
- }
- 输出结果:
main: start thread.
Thread started.
main: interrupt thread.
main: stop thread.
- Thread对象的interrupt方法仅仅把该线程的一个标志置为true,该方法本身并不包含任何中断线程的操作。
- stop方法可以将线程中止,但通过输出的结果可以发现,”Thread ended”并没有被输出,即线程本身不能进行任何清理工作。
PART.2 可中断的线程
- 线程应不断检查isInterrupted是否为true,当其返回true时,应开始清理并结束线程。(Test1中的while循环)
- Thread.sleep方法会在线程被中断时抛出InterruptedException,线程可以捕获该异常并开始清理和结束线程。(Test2中的Thread.sleep())
- 如果循环中不时调用Thread.sleep,可以处理isInterrupted。
可中断线程的例子:
- public class GeneralTest
- {
- public static void main(String[] args) throws Exception
- {
- Thread th1 = new Thread( new Test1());
- Thread th2 = new Thread( new Test2());
- // 启动 Test1 和 Test2 线程。
- System.out.println( "main: starting 'Test1' and 'Test2'." );
- th1.start();
- th2.start();
- // 等待3秒。
- System.out.println( "main: sleeping for 3 seconds." );
- Thread.sleep( 3000 );
- // 中断 Test1 和 Test2 线程。
- System.out.println( "main: interrupting 'Test1' and 'Test2'." );
- th1.interrupt();
- th2.interrupt();
- // 等待 Test1 和 Test2 线程结束。
- System.out.println( "main: waiting for 'Test1' and 'Test2' to end." );
- th1.join();
- th2.join();
- System.out.println( "main: end." );
- }
- private static class Test1 implements Runnable
- {
- @Override
- public void run()
- {
- System.out.println( "Test1: start." );
- while (!Thread.currentThread().isInterrupted())
- {
- // 其他操作...
- System.out.print( "" );
- }
- System.out.println( "Test1: end." );
- }
- }
- private static class Test2 implements Runnable
- {
- @Override
- public void run()
- {
- System.out.println( "Test2: start." );
- try
- {
- while ( true )
- {
- // 其他操作...
- Thread.sleep( 1000 );
- }
- }
- catch (InterruptedException e)
- {
- System.out.println( "Test2: InterruptedException" );
- }
- System.out.println( "Test2: end." );
- }
- }
- }
PART.3 isInterrupted()和interrputed()方法的区别
- isInterrupted方法是实例方法,interrupted方法是静态方法。
Thread.currentThread().isInterrupted()
Thread.interrupted()
-
interrupted方法在调用之后会将中断标志置为false。在只对线程调用一次interrupt的前提下interrupted方法只会返回一次true。
-
使用interrupted方法判断应确保在判断之后开始结束线程。
isInterrupted和interrupted方法比较的例子:
- public class InterruptedStateTest
- {
- public static void main(String[] args) throws Exception
- {
- // "Test1"
- Thread th1 = new Thread( new Test1());
- // 启动 Test1 线程,并在3秒之后中断该线程。
- th1.start();
- Thread.yield();
- System.out.println( "Test1 started... Waiting 3 seconds." );
- Thread.sleep( 3000 );
- System.out.println( "Interrupting Test1..." );
- th1.interrupt();
- Thread.sleep( 1000 );
- System.out.println( "---------------------------------------" );
- // “Test2"
- Thread th2 = new Thread( new Test2());
- // 启动 Test2 线程,并在3秒之后中断该线程。
- th2.start();
- Thread.yield();
- System.out.println( "Test2 started... Waiting 3 seconds." );
- Thread.sleep( 3000 );
- System.out.println( "Interrupting Test2..." );
- th2.interrupt();
- Thread.yield();
- // 主线程结束。
- System.out.println( "End of main." );
- }
- private static class Test1 implements Runnable
- {
- @Override
- public void run()
- {
- System.out.println( "Test1 start..." );
- while ( true )
- {
- if (Thread.currentThread().isInterrupted())
- {
- if (Thread.currentThread().isInterrupted())
- {
- System.out.println( "Interrupted..." );
- break ;
- }
- }
- }
- System.out.println( "Test1 end..." );
- }
- }
- private static class Test2 implements Runnable
- {
- @Override
- public void run()
- {
- // 记录线程开始时间。
- long startTime = System.currentTimeMillis();
- System.out.println( "Test2 start... " +
- "Automatically ends in 6 sec." );
- while ( true )
- {
- // 连续判断2次Thread.interrupted()
- if (Thread.interrupted())
- {
- if (Thread.interrupted())
- {
- System.out.println( "Interrupted..." );
- break ;
- }
- }
- // 如果线程2运行超过6秒将自动结束。
- if (System.currentTimeMillis() - startTime > 6000 )
- {
- System.out.println( "5 seconds..." );
- break ;
- }
- }
- System.out.println( "Test2 end" );
- }
- }
- }
例子中Test1连续判断2次Thread.currentThread().isInterrupted(), Test1仍然可以正常中断。
Test2连续判断2次Thread.interrupted(),因此Test2线程在被调用interrupt之后没有结束。
PART.4 处理阻塞
阻塞操作如BufferedReader的readLine方法,ServerSocket的accept方法将导致线程不能判断
isInterrupted(),因此线程中的阻塞不能永久阻塞。处理阻塞的方法有以下:
类
方法
超时后的处理
ReentrantLock
ReadLock
WriteLock
tryLock
(long, TimeUnit)
返回
false
Condition
await
(long, TimeUnit)
awaitNanos
(long)
awaitUntil
(Date)
返回
false
Future
get
(long, TimeUnit)
TimeoutException
CyclicBarrier
await
(long, TimeUnit)
TimeoutException
CountDownLatch
await
(long, TimeUnit)
返回
false
Exchanger
exchange
(V, long, TimeUnit)
TimeoutException
Semaphore
tryAcquire
(long, TimeUnit)
返回
false
BlockingQueue
<E>
offer
(E, long, TimeUnit)
poll
(long, TimeUnit)
返回
false
返回
null
BlockingDeque
<E>
offerFirst
(E, long, TimeUnit)
offerLast
(E, long, TimeUnit)
poolFirst
(long, TimeUnit)
poolLast
(long, TimeUnit)
返回
false
返回
null
ServerSocket
accept
()
通过
setSoTimeout
设置超时时间。
SocketTimeoutException
类
方法
异常
Thread
sleep
(long)
join
()
InterruptedException
ReentrantLock
ReadLock
WriteLock
lockInterruptibly
()
InterruptedException
Condition
await()
InterruptedException
Future
get
()
InterruptedException
CyclicBarrier
await
()
InterruptedException
CountDownLatch
await
()
InterruptedException
Exchanger
exchange
(V)
InterruptedException
Semaphore
acquire
()
InterruptedException
BlockingQueue
<E>
put
(E)
take
()
InterruptedException
BlockingDeque
<E>
putFirst
(E)
putLast
(E)
takeFirst
(E)
takeLast
(E)
InterruptedException
类
阻塞方法
可中断方法
ReentrantLock
ReadLock
WriteLock
lock
()
tryLock
()
tryLock
(long, TimeUnit)
lockInterruptibly
()
Condition
awaitUninterruptibly
()
await
()
await
(long, TimeUnit)
awaitNanos
(long)
awaitUntil
(Date)
Semaphore
acquireUninterruptibly
()
acquire()
tryAcquire()
tryAcquire(long, TimeUnit)
PART.5 处理Thread.sleep()
1. 捕获异常并结束线程
2. 捕获异常,再次调用interrupt
PART.6 处理ReentrantLock和Condition
1. 通过lockInterruptibly方法中断
2. 通过不设置超时的tryLock方法中断
3. 通过设置超时的tryLock方法中断
5. 可中断的Producer和Consumer示例
Producer:
Consumer:
PART.8 处理Socket和ServerSocket
1. 处理ServerSocket的accept方法
2. 处理包装自Socket的BufferedReader的readLine方法
3. 处理包装自Socket的ObjectInputStream的readObject方法
其中,
TestData
是一个简单的可序列化的类。
PART.9 总结
见“PART.2可中断的线程”和“PART.4 处理阻塞”。
发表评论
-
JAAS authentication in Tomcat example
2018-11-19 20:32 490... -
druid 数据库密码加密
2015-03-12 17:43 1353cmd命令:1、切换的druid-0.2.9.jar包所在目 ... -
检测Java对象所占内存大小
2012-05-29 16:57 1251http://blog.csdn.net/zzt_johnso ... -
在 JNI 编程中避免内存泄漏
2012-04-16 15:55 1125http://www.ibm.com/developerwor ... -
Java Native Interface Specification
2012-04-16 15:04 1539http://docs.oracle.com/javase/1 ... -
基本JNI调用技术(c/c++与java互调)
2012-04-16 15:03 1274http://blog.csdn.net/zjsjava/ar ... -
ProGuard
2012-04-10 21:34 901http://proguard.sourceforge.net ... -
[Java]将一个字符串按照指定字符数进行分割
2012-03-27 13:20 3444public static String[] spli ... -
java中的字符串分割函数
2012-03-27 10:26 14069Java中的我们可以利用split把字符串按照指定的分割符进行 ... -
如何中断线程in Java
2012-03-26 13:08 1127http://android.blog.51cto.com/2 ... -
Android多线程设计模式之-wait()和notify()机制
2012-03-26 12:50 1862通常,多线程之间需要 ... -
[AndroidTips]Android how to check screen off 判断屏幕是开还是关
2012-03-21 15:58 1535pm = (PowerManager) context.get ... -
java中关键字volatile的作用
2012-03-21 11:30 1162http://sakyone.iteye.com/blog/6 ... -
mytracks - MyTracks for Android
2012-03-20 10:10 1721http://code.google.com/p/mytrac ... -
EasyMock 使用方法与原理剖析
2012-03-19 13:22 1098https://www.ibm.com/developerwo ... -
maven设置HTTP代理
2012-03-16 14:52 5529http://maven.apache.org/ Apa ... -
Dalvik虚拟机的垃圾回收
2012-03-01 15:59 3439http://blog.csdn.net/caimouse/a ... -
Memory Management for Android Apps
2012-02-29 22:34 1063http://www.google.com/events/io ... -
Android GC
2012-02-29 21:32 305228470 dalvikvm D ... -
Build Android project with Findbugs ant task
2012-02-27 14:24 3589http://findbugs.sourceforge.net ...
相关推荐
java中断线程的正确姿势完整示例.rar
线程中断 静态方法(有关同步的细节) 总结 第五章 Java线程编程的例子 数据结构和容器 简单的同步例子 一个网络服务器类 AsyncInputStream类 使用TCPServer和AsynclnputStream 总结 第六章 Java线程调度 线程...
Java 实例 - 中断线程源代码+详细指导教程.zip
该方法“中断线程”,但仅仅是会设置该线程的中断状态位为true,至于中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。 线程会不时地检测这个中断标示位,以判断线程...
java线程中断之interrupt和stop.docx
之前在使用Java实现熔断降级组件的时候,需要实现接口请求的超时中断,通过查找相关资料了解了相关的方法,下面这篇文章主要给大家介绍了关于Java中实现线程的超时中断的相关资料,需要的朋友可以参考下
锁定排序 3.6 线程优先级 3.7 监控程序线程 3.8 在应用程序中...线程中断 3.10 完成DownloadManager 3.11 线程中的过时方法 3.12 DownloadFiles类 3.13 未捕捉的异常 3.14 自愿放弃...
Java基本功之中断线程的理解[参考].pdf
Java线程中断示例程序的代码清单.pdf 学习资料 复习资料 教学资源
Java的中断是一种协作机制。也就是说调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己,本文将详细介绍,需要了解的朋友可以参考下
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
在java中,线程的中断(interrupt)只是改变了线程的中断状态,至于这个中断状态改变后带来的结果,那是无法确定的,有时它更是让停止中的线程继续执行的唯一手段。不但不是让线程停止运行,反而是继续执行线程的...
主要介绍了Java中断一个线程操作,结合实例形式分析了java中断线程相关的interrupt()、isInterrupted()及interrupted()函数使用技巧,需要的朋友可以参考下
Java如何中断一个正在运行的线程[整理].pdf
Java多线程与线程安全实践-基于Http协议的断点续传.rar 是一个Java毕业设计项目,旨在探讨如何在Java中实现多线程和线程安全,以及如何基于Http协议实现断点续传功能。该项目提供了一个完整的源代码包,可以作为学习...
interrupt字面上是中断的意思,但在Java里Thread.interrupt()方法实际上通过某种方式通知线程,并不会直接中止该线程
主要介绍了Java中断线程的方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下
java的线程机制是抢占式的,这表示调试 机制会周期性的中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都分分配到数据合理的时间去驱动 它的任务。在多线程中,一般对于static用的...
绍Java如何中断一个正在运行的线程
JAVA100例之实例66 实现对线程的控制,中断、挂起、恢复、停止