方法

JoinThread - 图2

  1. 调用方线程(调用join方法的线程)执行等待操作,
  2. 直到被调用的线程(join方法所属的线程)结束,再被唤醒
  3. public final void join() throws InterruptedException {
  4. join(0);
  5. }
  1. public class JoinDemo extends Thread{
  2. int i;
  3. Thread previousThread; //上一个线程
  4. public JoinDemo(Thread previousThread,int i){
  5. this.previousThread=previousThread;
  6. this.i=i;
  7. }
  8. @Override
  9. public void run() {
  10. try {
  11. //调用上一个线程的join方法,大家可以自己演示的时候可以把这行代码注释掉
  12. // thread.join的含义是
  13. // 当前线程需要等待previousThread线程终止之后才从thread.join返回。
  14. // 简单来说,就是线程没有执行完之前,会一直阻塞在join方法处。
  15. previousThread.join(); //
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. System.out.println("num:"+i);
  20. }
  21. public static void main(String[] args) {
  22. Thread previousThread=Thread.currentThread();
  23. for(int i=0;i<10;i++){
  24. JoinDemo joinDemo=new JoinDemo(previousThread,i);
  25. joinDemo.start();
  26. previousThread=joinDemo;
  27. }
  28. }
  29. }

yield

使当前线程从执行状态(运行状态)变为可执行态(就绪状态)。cpu会从众多的可执行态里选择,也就是说,当前也就是刚刚的那个线程还是有可能会被再次执行到的,并不是说一定会执行其他线程而该线程在下一次中不会执行到了。

Sleep

Thread - 图3
**

interrupt

interrupt不会真正停止一个线程,它仅仅是给这个线程发了一个信号告诉它,它应该要结束了(明白这一点非常重要!)

  • 也就是说:Java设计者实际上是想线程自己来终止,通过上面的信号,就可以判断处理什么业务了。
  • 具体到底中断还是继续运行,应该由被通知的线程自己处理 ```java Thread t1 = new Thread( new Runnable(){ public void run(){
    1. // 若未发生中断,就正常执行任务
    2. while(!Thread.currentThread.isInterrupted()){
    3. // 正常任务代码……
    4. }
    5. // 中断的处理代码……
    6. doSomething();
    } } ).start();

``` 再次说明:调用interrupt()并不是要真正终止掉当前线程,仅仅是设置了一个中断标志。这个中断标志可以给我们用来判断什么时候该干什么活!什么时候中断由我们自己来决定,这样就可以安全地终止线程了!
所以说:interrupt方法压根是不会对线程的状态造成影响的,它仅仅设置一个标志位罢了
interrupt线程中断还有另外两个方法(检查该线程是否被中断)