- 浏览: 1508109 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (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 649... -
druid 数据库密码加密
2015-03-12 17:43 1398cmd命令:1、切换的druid-0.2.9.jar包所在目 ... -
检测Java对象所占内存大小
2012-05-29 16:57 1296http://blog.csdn.net/zzt_johnso ... -
在 JNI 编程中避免内存泄漏
2012-04-16 15:55 1174http://www.ibm.com/developerwor ... -
Java Native Interface Specification
2012-04-16 15:04 1657http://docs.oracle.com/javase/1 ... -
基本JNI调用技术(c/c++与java互调)
2012-04-16 15:03 1315http://blog.csdn.net/zjsjava/ar ... -
ProGuard
2012-04-10 21:34 940http://proguard.sourceforge.net ... -
[Java]将一个字符串按照指定字符数进行分割
2012-03-27 13:20 3487public static String[] spli ... -
java中的字符串分割函数
2012-03-27 10:26 14129Java中的我们可以利用split把字符串按照指定的分割符进行 ... -
如何中断线程in Java
2012-03-26 13:08 1170http://android.blog.51cto.com/2 ... -
Android多线程设计模式之-wait()和notify()机制
2012-03-26 12:50 1941通常,多线程之间需要 ... -
[AndroidTips]Android how to check screen off 判断屏幕是开还是关
2012-03-21 15:58 1586pm = (PowerManager) context.get ... -
java中关键字volatile的作用
2012-03-21 11:30 1207http://sakyone.iteye.com/blog/6 ... -
mytracks - MyTracks for Android
2012-03-20 10:10 1769http://code.google.com/p/mytrac ... -
EasyMock 使用方法与原理剖析
2012-03-19 13:22 1132https://www.ibm.com/developerwo ... -
maven设置HTTP代理
2012-03-16 14:52 5571http://maven.apache.org/ Apa ... -
Dalvik虚拟机的垃圾回收
2012-03-01 15:59 3484http://blog.csdn.net/caimouse/a ... -
Memory Management for Android Apps
2012-02-29 22:34 1105http://www.google.com/events/io ... -
Android GC
2012-02-29 21:32 310428470 dalvikvm D ... -
Build Android project with Findbugs ant task
2012-02-27 14:24 3671http://findbugs.sourceforge.net ...
相关推荐
【Python】聊天机器人测试框架_pgj
Python微专业-项目实战_hy4
23种设计模式_hy4
消息中间件源码学习(打注释学习)_hy5
python网络爬虫按月爬cctv新闻30分的视频_hy4
ApacheMINA(MultipurposeInfrastructureforNetworkApplications)_hy4
Python微专业-项目实战_hy5
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
该项目是一款基于微信小程序的东源赛事报名系统设计源码,包含550个文件,涵盖120个JavaScript文件、105个JSON配置文件、104个WXSS样式文件、99个WXML模板文件、80个TypeScript文件、24个PNG图片文件、9个WXS组件文件、5个JPG图片文件、1个Git忽略文件和1个Markdown文件。系统集成了报名、缴费、赛事抽签、晋级等多个功能模块,旨在为用户提供便捷、高效、流畅的赛事报名及后续管理流程体验。
SpringBoot分布式事务_hy4
一个使用和风天气API获取天气信息并通过SMTP发送到邮箱的python小项目[参赛项目]_hy4
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
该优化后的项目描述为:本项目是一款基于Material Design风格的Boat APP Java版启动器美化设计源码,包含4680个文件,涵盖1778个Java类文件、900个PNG图片文件、797个XML布局文件、556个DEX可执行文件、291个JSON配置文件、75个Java源代码文件、68个SO库文件、35个文本文件、34个JAR库文件、23个其他类型文件和文件类型不明的23个文件。此启动器专为Android设备上运行的Minecraft Java版打造,旨在提升用户体验。
该项目是基于kunpeng芯片的prefetch_tuning性能参数调整设计源码,包含21个文件,包括14个Shell脚本、2个Markdown文档、2个C语言源文件、1个许可证文件、1个Makefile文件和1个头文件。主要使用C语言编写,辅以Shell和C语言进行辅助操作。
Datadevelopengine数据研发引擎,用可视化的组件编排后台数据处理逻辑,配合消息触发、定时任务和res_hy5
李宏毅机器学习2020课程的相关代码_hy4
【C#】WebSocket为微信小程序等提供独立的WebSocket服务器端环境
基于Python的百度百科爬虫_hy4
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。