线程_join与中断线程

join与中断线程(2)

1、join

join()方法:加入线程让调用的线程先执行指定时间或者是指向完毕

异常:InterruptedException-如果任何线程中断当前线程。当抛出异常时,当前线程的中断状态被清除
package com.huanghe;

/**
 * @Author: River
 * @Date:Created in  10:27 2018/5/28
 * @Description: join()方法:加入线程让调用的线程先执行指定时间或者是指向完毕
 */
public class ThreadDemo2 {
    public static void main(String[] args) {

        MyRunable2 mr2 = new MyRunable2();
        Thread t = new Thread(mr2);
        t.start();

        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (i == 10) {
                try {
                    t.join();//让t线程执行完毕
                }catch (InterruptedException e){
                    e.printStackTrace();
                }
            }
        }

    }
}

class MyRunable2 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
执行的结果如下:
main--0
Thread-0--0
main--1
Thread-0--1
main--2
Thread-0--2
main--3
Thread-0--3
Thread-0--4
main--4
Thread-0--5
main--5
Thread-0--6
main--6
Thread-0--7
main--7
main--8
Thread-0--8
Thread-0--9
main--9
main--10
Thread-0--10
Thread-0--11
Thread-0--12
Thread-0--13
Thread-0--14
Thread-0--15
Thread-0--16
Thread-0--17
Thread-0--18
Thread-0--19
main--11
main--12
main--13
main--14
main--15
main--16
main--17
main--18
main--19

2、中断

public void interrupt():
//中断这个线程
//除非当前线程中断自身,这是始终允许的
public static boolean interrupted()
 //测试当前线程是否中断。该方法可以清除中断状态。换句话说,如果这个方法被连续的调用两次,那么第二个调用将返回false(除非当前线程再次中断,在第一个调用已经清除其中的中断状态之后,在第二个调用之前已经检查过)
package com.huanghe;

/**
 * @Author: River
 * @Date:Created in  10:27 2018/5/28
 * @Description: join()方法:加入线程让调用的线程先执行指定时间或者是指向完毕
 */
public class ThreadDemo2 {
    public static void main(String[] args) {

        MyRunable2 mr2 = new MyRunable2();
        Thread t = new Thread(mr2);
        t.start();

        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
           if (i == 10) {
//                try {
//                    t.join();//让t线程执行完毕
//                }catch (InterruptedException e){
//                    e.printStackTrace();
//                }
               t.interrupt();//1、中断线程,中断标记
            }
        }

    }
}

class MyRunable2 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i <20 ; i++) {
             if (Thread.interrupted()){//4)测试中断状态,此方法会把中断标记清除
                break;
            }
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace(); //2、因为在sleep中会抛出中断异常,并且异常会被清除
                 t.interrupt();//3、中断标记需要再次的被打上
            }
        }
    }
}
//执行的结果
main--0
Thread-0--0
main--1
java.lang.InterruptedException: sleep interrupted
Thread-0--1
    at java.lang.Thread.sleep(Native Method)
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
java.lang.InterruptedException: sleep interrupted
main--2
Thread-0--2
    at java.lang.Thread.sleep(Native Method)
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
main--3
java.lang.InterruptedException: sleep interrupted
Thread-0--3
    at java.lang.Thread.sleep(Native Method)
Thread-0--4
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
main--4
java.lang.InterruptedException: sleep interrupted
Thread-0--5
    at java.lang.Thread.sleep(Native Method)
Thread-0--6
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
Thread-0--7
main--5
java.lang.InterruptedException: sleep interrupted
Thread-0--8
    at java.lang.Thread.sleep(Native Method)
main--6
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
Thread-0--9
    at java.lang.Thread.run(Thread.java:745)
java.lang.InterruptedException: sleep interrupted
main--7
    at java.lang.Thread.sleep(Native Method)
Thread-0--10
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
Thread-0--11
    at java.lang.Thread.run(Thread.java:745)
java.lang.InterruptedException: sleep interrupted
main--8
    at java.lang.Thread.sleep(Native Method)
Thread-0--12
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
java.lang.InterruptedException: sleep interrupted
Thread-0--13
    at java.lang.Thread.sleep(Native Method)
main--9
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
Thread-0--14
    at java.lang.Thread.run(Thread.java:745)
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
Thread-0--15
main--10
Thread-0--16
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
main--11
Thread-0--17
main--12
java.lang.InterruptedException: sleep interrupted
Thread-0--18
    at java.lang.Thread.sleep(Native Method)
Thread-0--19
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
main--13
java.lang.InterruptedException: sleep interrupted
    at java.lang.Thread.sleep(Native Method)
    at com.huanghe.MyRunable2.run(ThreadDemo2.java:42)
    at java.lang.Thread.run(Thread.java:745)
main--14
main--15
main--16
main--17
main--18
main--19

从执行的结果中可以看出,程序并没有停止执行,但是抛出了异常,这个异常是Runable里面的sleep抛出的异常,t.interrup();只是做了一个中断标记,t是不是真的需要中断进行,需要线程自己进行决定;

所以如果需要完成一个正常的中断,需要上面的四步才可以顺序的完成

3、自定义标记中断线程

由于上面的中断过程很麻烦,所以在做中断线程的时候使用的是自定义中断线程

package com.huanghe;

/**
 * @Author: River
 * @Date:Created in  10:27 2018/5/28
 * @Description: join()方法:加入线程让调用的线程先执行指定时间或者是指向完毕
 * (1):使用Interrupt方法中断线程,设置一个中断标记
 * (2):自定义中断标记
 */
public class ThreadDemo2 {
    public static void main(String[] args) {

        MyRunable2 mr2 = new MyRunable2();
        Thread t = new Thread(mr2);
//        t.start();

        MyRunable3 mr3 = new MyRunable3();
        Thread t2 = new Thread(mr3);
        t2.start();

        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
           if (i == 10) {
//                try {
//                    t.join();//让t线程执行完毕
//                }catch (InterruptedException e){
//                    e.printStackTrace();
//                }
//               t.interrupt();//中断线程,中断标记
               mr3.flag=false;//自定义中断异常
            }

        }

    }
}

class MyRunable2 implements Runnable{

    @Override
    public void run() {
        for (int i = 0; i <20 ; i++) {
            if (Thread.interrupted()){//测试中断状态,此方法会把中断标记清除
                break;
            }
            System.out.println(Thread.currentThread().getName()+"--"+i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
                Thread.currentThread().interrupt();
            }
        }
    }
}


class MyRunable3 implements Runnable{

    public boolean flag=true;

    public MyRunable3(){
        flag = true;
    }

    @Override
    public void run() {
        int i = 0;
        while (flag) {
            System.out.println(Thread.currentThread().getName() + "====" + (i++));
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_40304387/article/details/80480236