美文网首页
线程中断、线程让步、线程合并(四)

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

作者: Aluha_f289 | 来源:发表于2019-04-27 21:26 被阅读0次

线程中断

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

相关文章

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

    线程中断 线程执行一段时间会结束 线程合并 执行结果 线程让步 当某个线程(t1或者t2)执行到10次、20次、3...

  • 泥瓦匠聊并发编程基础篇:线程中断和终止

    1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断...

  • 阿里P8聊并发编程:线程中断和终止

    一、线程中断 1.什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程...

  • 线程中断

    什么是线程中断?线程中断即线程运行过程中被其他线程打断了。 线程中断的重要方法2.1 java.lang.Thre...

  • Java多线程 -- 03 控制线程

    目录导读 join线程:join 后台线程(Daemon Thread) 线程睡眠:sleep 线程让步:yiel...

  • Java线程及多线程相关

    多线程 中断 每个线程都有一个boolean类型的中断状态。当在另一个线程中断该线程时,这个线程的中断状态将被设置...

  • DPDK-suricata

    一 线程 单网卡单队列,worker模式下的线程情况: 二 线程堆栈 2.1 2号线程中断处理线程 中断线程执行主...

  • (4)线程中断

    什么是线程中断 java中的线程中断并不是指强制线程中断执行,而是指调用线程中断起到一个通知作用,让线程知道自己被...

  • 7 什么是线程中断

    线程中断 线程中断指的是线程的一种状态,中断不是自发产生的,而是其它线程发出的一种指令.本线程通过判断是否接收中断...

  • JAVA并发编程(三)线程协作与共享

    1. 线程中断 java线程中断是协作式,而非抢占式 1.1. 线程中断相关方法 interrupt()将线程的中...

网友评论

      本文标题:线程中断、线程让步、线程合并(四)

      本文链接:https://www.haomeiwen.com/subject/daslnqtx.html