1如何获取当前线程
Thread类有一个静态方法 static method叫做 currentThread()方法,它会获得当前运行的进程中正在获得系统资源并在运行其run()方法的那个线程对象的引用.
范例代码
public class MyThread extends Thread{
public void run(){
if(Thread.currentThread()!=this){
throw new IllegalStateException("run method called by incorrect thread");
}
...main logic...
}
}
____________________________________________
例二
在Runnable对象上观察它自己是否被中断
public class MyRunnable implements Runnable{
public void run(){
while(!Thread.currentThread().isInterrupted()){//当当前线程(线程对象,任务性质的线程对象)没有被中断的情况下运行while循环的循环体中的代码
.....main logic .....
}
}
}
用法总结:
我们可以使用Thread.currentThread()来获得当前程序正在执行的thread对象的引用以便利用该引用(对象的引用),去调用该当前线程对象所具有的其他成员方法。
————————————————————————————
2什么是阻塞类型的方法?
当一个方法会阻塞住它所在线程的执行,换句话说的一个方法梗塞住了不动了它在等待某一个事情的发生在这期间该方法下一行代码无法被执行,因为这个梗塞的方法还没有完成它自己的使命(还没有被执行完)使得它的后续命令行(指令语句)无法被顺次执行,从而使得该方法所在的线程体被阻塞(BLOCK)(属于正常现象),即blocking method(阻塞方法)会
block(阻塞)住它所在的线程体(thread 的run方法体)的继续执行直到该阻塞方法要等待的某件事发生完为止,(当该阻塞方法被完全执行完毕后其后续指令行语句才会被顺次执行,继而该阻塞方法所在的线程体才得以继续执行已达到完成的目的) (有的死锁情况就是由阻塞方法被阻断后导致线程体跑不下去导致的)
——————————————————————————————————
thread是可以通过调用sleep()方法来挂起自己的执行动作一段指定的期间。当thread对象执行到sleep()方法时,它会在所谓的沉睡时间暂停所给数目的毫秒时间,当暂停时间已经到时,该 thread会被叫醒并继续执行sleep()方法下一行的语句。
严格来讲sleeping与thread的suspension是两回事。其中一个重要的差别是,真正的suspension会由某个外部 Thread类型对象去suspend(且稍后会resume)另外一个Thread对象。 而sleep()方法仅仅会影响到执行这个sleep()方法的那个Thread对象而不会影响到另外一个Thread对象。(一个Thread对象只能够让自己sleep(),不能让另外一个thread对象sleep())
首先要知道suspend方法和resume方法是一对固定搭配
一旦thread开始执行它的run()方法,它会持续执行到run()完成为止。如果你熟悉其它Thread model,可能早已经知道“Thread suspendsion”的概念,意思就是一个Thread thread1 被另一个Thread thread2 告知要使得thread1要被暂停执行它的执行动作。稍后thread1会被恢复,也就是被告知继续它的执行动作。
注意:Thread class具有suspend()和resume()方法,他们同样遭遇到了 stop()方法的race condition问题的干扰,所以实际上这三个方法
suspend(),resume(),和stop()早已经被java api 废弃掉了。
因此Thread的中断与恢复采用了新的一个机制——————“等待”与“通知”机制来实现thread的中断与恢复,而不是采用从其他的Thread对象调用suspend()和resume()方法来实现对另一个thread的中断与恢复。