您的位置:首页 > 编程语言 > Java开发

Java线程学习笔记(四)-线程沉睡,唤醒,连接

2017-08-10 15:28 204 查看
线程沉睡(sleep)并不会让线程释放它所持有的同步锁,而且在这期间也不会阻碍其他线程的运行。唤醒(interrupt)可以将沉睡或阻塞的线程唤醒。
线程沉睡:线程沉睡可以使当前线程沉睡一段时间,在这段时间内不会有时间片分配给线程。直到过完这段时间,线程又重新运行。
线程唤醒:线程唤醒可以使得执行了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()方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: