Java线程学习笔记(四)-线程沉睡,唤醒,连接
2017-08-10 15:28
204 查看
线程沉睡(sleep)并不会让线程释放它所持有的同步锁,而且在这期间也不会阻碍其他线程的运行。唤醒(interrupt)可以将沉睡或阻塞的线程唤醒。
线程沉睡:线程沉睡可以使当前线程沉睡一段时间,在这段时间内不会有时间片分配给线程。直到过完这段时间,线程又重新运行。
线程唤醒:线程唤醒可以使得执行了sleep操作的线程或执行了wait操作或者join操作的线程唤醒。线程沉睡要指定沉睡的时间,如果对该线程执行interrput 操作,线程可以提早继续运行,但是对于唤醒线程,单线程自己无法唤醒自己,只能等休眠结束。如果要在休眠中唤醒自己只能由另一线程唤醒自己。
线程连接:线程连接是线程间运行调度的一种操作,即线程需要等待其他线程运行结束后才能够开始,否则继续等待下去。线程连接有两种形式:join(参数)和join(),在join(参数)方法中参数表示等待的时间,单位是毫秒。若超出这个时间,则无论前面线程是否执行完毕,该线程都会继续运行。如果时间为0,则表示无期限等待。join()方法相当于join(0),表示无期限地等待。
源程序
源程序解读
源代码感觉设计的有问题,这里是经过简化和整理后的代码。
(1)TextSleepAndInterrupt类继承Thread类必须要实现run()方法。在run()方法中调用Thread类的sleep()方法让线程休眠(暂停)指定的时间,如果出现异常则线程被唤醒。isAlive()方法表示线程是否是被激活,如果是激活的则返回真,否则返回假。
(2)getUp()方法通过currentThread()方法获得当前线程,interrupt()方法唤醒该线程,isInterrupted判断线程是否被唤醒。当线程被唤醒时如果调用休眠sleep()方法则会抛出唤醒异常。
(3)在main()主方法中线程的join()方法是等待前一个或几个线程运行结束后再运行getUp()方法。
线程沉睡:线程沉睡可以使当前线程沉睡一段时间,在这段时间内不会有时间片分配给线程。直到过完这段时间,线程又重新运行。
线程唤醒:线程唤醒可以使得执行了sleep操作的线程或执行了wait操作或者join操作的线程唤醒。线程沉睡要指定沉睡的时间,如果对该线程执行interrput 操作,线程可以提早继续运行,但是对于唤醒线程,单线程自己无法唤醒自己,只能等休眠结束。如果要在休眠中唤醒自己只能由另一线程唤醒自己。
线程连接:线程连接是线程间运行调度的一种操作,即线程需要等待其他线程运行结束后才能够开始,否则继续等待下去。线程连接有两种形式:join(参数)和join(),在join(参数)方法中参数表示等待的时间,单位是毫秒。若超出这个时间,则无论前面线程是否执行完毕,该线程都会继续运行。如果时间为0,则表示无期限等待。join()方法相当于join(0),表示无期限地等待。
源程序
package core; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; public class TextSleepAndInterrupt extends Thread{ private DateFormat dateFormat=new SimpleDateFormat("HH-mm-ss:SSSS"); public void run(){ System.out.println(dateFormat.format(new Date())+" "+getName()+" 沉睡3秒钟"); try { sleep(3000); //线程休眠3秒钟 } catch (InterruptedException e) {//捕获唤醒异常 System.out.println(getName()+dateFormat.format(new Date())+getName()+"唤醒异常"+e.getMessage()); } interrupt();//唤醒线程,单线程自己无法唤醒自己,只能等休眠结束,可看控制台的输出时间。如果要在休眠中唤醒自己只能由另一线程唤醒自己 System.out.println(dateFormat.format(new Date())+" 沉睡的我,是否唤醒?"+isAlive()); } public void getUp(){ Thread.currentThread().interrupt();//唤醒当前线程 while(true){ if(Thread.currentThread().isInterrupted()){//判断当前线程是否被唤醒 System.out.println(dateFormat.format(new Date())+" 当前我是否被唤醒?"+Thread.currentThread().isInterrupted()); try { Thread.currentThread().sleep(1); //线程休眠 } catch (InterruptedException e) { System.out.println(dateFormat.format(new Date())+" "+getName()+" 唤醒异常 "+e.getMessage()+" "+Thread.currentThread().isInterrupted()); } System.out.println(dateFormat.format(new Date())+" 沉睡后是否被唤醒? "+Thread.currentThread().isInterrupted()); } } } public static void main(String[] args) { TextSleepAndInterrupt text=new TextSleepAndInterrupt(); text.start();//启动线程 try { text.join(); //线程连接 线程需要等待其他线程运行结束后才能够开始 } catch (InterruptedException e) {//捕获唤醒异常 e.printStackTrace(); System.out.println(" 唤醒异常: "+e.getMessage()); } text.getUp(); } }运行截图
源程序解读
源代码感觉设计的有问题,这里是经过简化和整理后的代码。
(1)TextSleepAndInterrupt类继承Thread类必须要实现run()方法。在run()方法中调用Thread类的sleep()方法让线程休眠(暂停)指定的时间,如果出现异常则线程被唤醒。isAlive()方法表示线程是否是被激活,如果是激活的则返回真,否则返回假。
(2)getUp()方法通过currentThread()方法获得当前线程,interrupt()方法唤醒该线程,isInterrupted判断线程是否被唤醒。当线程被唤醒时如果调用休眠sleep()方法则会抛出唤醒异常。
(3)在main()主方法中线程的join()方法是等待前一个或几个线程运行结束后再运行getUp()方法。
相关文章推荐
- 利用等待唤醒机制实现线程间的通信
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
- Android4.0 以后不允许在主线程进行网络连接 分类: H1_ANDROID 2013-10-09 14:32 2744人阅读 评论(0) 收藏
- Android4.0 以后不允许在主线程进行网络连接
- 关于android长连接及休眠唤醒的几篇文章
- 2 从create_new_thread看连接线程
- 执行更新版本获取服务器连接必须开启一个新的线程
- Thread(线程间通讯,等待唤醒机制)
- java 中wait和notify 线程等待和线程唤醒的使用方式 需要借助synchronized
- 线程中的通知和唤醒
- 从香港虚拟主机开始 唤醒沉睡中的网站
- Android一个线程内连接多个tcp服务端
- Qt跨线程信号和槽的连接
- 线程等待与唤醒
- 互联网远程唤醒android车机(车机连接USB 4G模块)的实现
- C/C++ Windows API——线程挂起、唤醒与终止
- Object类中的 notifyAll()方法唤醒后,线程怎么执行
- 线程的挂起和唤醒
- 线程间通信、等待唤醒机制、生产者消费者问题(Lock,Condition)、停止线程和守护线程、线程优先级
- java多线程系类:基础篇:05线程的等待与唤醒