线程中断、线程让步、线程合并(四)

线程中断

package demo4;

/**
 * interrupt()方法并不是中断线程的执行,
 *  而是为调用该方法的线程对象打上一个标记,
 *  设置其中断状态为true,通过isInterrupted()方法可以得到这个线程状态,
 */
public class InterruptTest {
    public static void main(String[] args) throws InterruptedException {
        MyThread t = new MyThread("MyThread");
        t.start();
        Thread.sleep(100);// 睡眠100毫秒
        t.interrupt();// 中断t线程
    }
}

class MyThread extends Thread {
    int i = 0;

    public MyThread(String name) {
        super(name);
    }
    public void run() {
        /*
        while(true) {// 死循环,等待被中断(线程无法被中断)

            System.out.println(getName() + getId() + "执行了" + ++i + "次");

        }
        */

        while(!isInterrupted()) {// 当前线程没有被中断,则执行

            System.out.println(getName() + getId() + "执行了" + ++i + "次");

        }
    }
}

线程执行一段时间会结束

MyThread12执行了3807次
MyThread12执行了3808次
MyThread12执行了3809次
MyThread12执行了3810次
MyThread12执行了3811次
MyThread12执行了3812次
MyThread12执行了3813次
MyThread12执行了3814次
MyThread12执行了3815次
MyThread12执行了3816次
MyThread12执行了3817次
MyThread12执行了3818次
MyThread12执行了3819次
MyThread12执行了3820次
MyThread12执行了3821次

Process finished with exit code 0

线程合并

package demo4;

/**
 * 线程合并是优先执行调用该方法的线程,再执行当前线程
 */
public class JoinTest {
    public static void main(String[] args) throws InterruptedException {
        JoinThread t1 = new JoinThread("t1");
        JoinThread t2 = new JoinThread("t2");
        t1.start();

        t2.start();
        t1.join();

        t2.join();
        System.out.println("主线程开始执行!");
    }
}
class JoinThread extends Thread {
    public JoinThread(String name) {
        super(name);
    }

    public void run() {

        for(int i = 1; i <= 10; i++)

            System.out.println(getName() +":"+ getId() + "执行了" + i + "次");

    }
}

执行结果

t1:12执行了1次
t1:12执行了2次
t1:12执行了3次
t1:12执行了4次
t1:12执行了5次
t1:12执行了6次
t1:12执行了7次
t2:13执行了1次
t2:13执行了2次
t2:13执行了3次
t2:13执行了4次
t2:13执行了5次
t2:13执行了6次
t2:13执行了7次
t2:13执行了8次
t2:13执行了9次
t2:13执行了10次
t1:12执行了8次
t1:12执行了9次
t1:12执行了10次
主线程开始执行!

Process finished with exit code 0

线程让步

package demo4;

/**
 * 线程让步用于正在执行的线程,在某些情况下让出CPU资源,让给其它线程执行
 */
public class YieldTest {
    public static void main(String[] args) throws InterruptedException {
        // 创建线程对象

        YieldThread t1 = new YieldThread("t1");

        YieldThread t2 = new YieldThread("t2");

        // 启动线程

        t1.start();

        t2.start();

        // 主线程休眠100毫秒

        Thread.sleep(100);

        // 终止线程

        t1.interrupt();

        t2.interrupt();
    }
}
class YieldThread extends Thread {
    int i = 0;

    public YieldThread(String name) {

        super(name);

    }

    public void run() {

        while (!isInterrupted()) {

            System.out.println(getName() + "执行了" + ++i + "次");
            if (i % 10 == 0) {// 当i能对10整除时,则让步

                Thread.yield();

            }
        }
    }
}

当某个线程(t1或者t2)执行到10次、20次、30次等时,就会马上切换到另一个线程执行,接下来再交替执行,如此往复。

学习于https://blog.csdn.net/ghsau/article/details/17560467

你可能感兴趣的:(线程中断、线程让步、线程合并(四))