线程方法——常用线程方法及yield, join, interrupt, setDaemon

本文详细介绍了Java中常用的线程方法,包括设置线程名称、获取线程名称、设置优先级、线程休眠、yield礼让、join插队、interrupt中断以及setDaemon守护线程的概念和使用示例,帮助理解线程间的协作与控制。
摘要由CSDN通过智能技术生成

常用线程方法:

对象.setName("线程名称")——线程设置名称
对象.getName()——获取指定线程名称
对象.setPriority(Thread.MIN_PRIORITY)——设置线程优先级, 注意优先级指的不是优先级高的就是先运行,运行的顺序不同的操作系统有不同的算法计算
对象.getPriority()——获取指定线程的优先级
Thread.sleep(1000)——线程休眠1秒, 括号中单位ms(1s = 1000ms)
*Thread.currentThread().方法——对当前执行的线程进行操作

线程优先级:

yield:

线程礼让, 当多个线程都在执行时, 执行了yield()的线程可能会停下让其他线程先执行, 不一定礼让成功。举个例子:

这就解释了为什么会出现礼让不成功的现象。实际情况就是线程礼让成功,但是由于其他cpu是空闲状态于是去了其他的cpu继续执行

代码演示——yield:

public class ThreadMethod {
    public static void main(String[] args) throws InterruptedException {
        TestMethod testMethod = new TestMethod();
        testMethod.start();
        for (int i = 0; i < 5; i++) {
            Thread.sleep(500);
            System.out.println("小猫喵~" + i);
        }
    }
}

class TestMethod extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            if (i == 5) {
                Thread.yield();// 礼让, 先别的线程先行, 不一定成功
            }
            try {
                System.out.println("小狗汪汪叫" + i);
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("小狗不叫了");
    }
}

运行结果:

join:

线程插队, 当多个线程都在执行时, 执行了join()的线程会强制让其它线程停下, 自己执行完毕其他线程继续执行

代码演示——join:

public class ThreadMethod {
    public static void main(String[] args) throws InterruptedException {
        TestMethod testMethod = new TestMethod();
        testMethod.start();
        for (int i = 0; i < 5; i++) {
            if (i == 2) {
                testMethod.join();
            }
            Thread.sleep(500);
            System.out.println("小猫喵~" + i);
        }
    }
}

class TestMethod extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            try {
                System.out.println("小狗汪汪叫" + i);
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("小狗不叫了");
    }
}

运行结果:

interrupt:

中断线程, 中断休眠, 注意不是结束线程

代码演示——interrupt:

public class ThreadMethodDemo {
    public static void main(String[] args) throws InterruptedException {
        TestMethod testMethod = new TestMethod();

        testMethod.setPriority(Thread.MIN_PRIORITY);// 设置线程优先级
        testMethod.setName("子线程");
        testMethod.start();// 启动子线程

        // 主线程打印 5次, 然后中断子线程的休眠
        for (int i = 0; i < 5; i++) {
            Thread.sleep(1000);
            System.out.println("主线程" + i);
        }
        System.out.println(testMethod.getName() + "线程的优先级是:" + testMethod.getPriority());// 获取优先级
        testMethod.interrupt();// 中断子线程, 中断它的休眠
    }
}

class TestMethod extends Thread {
    @Override
    public void run() {
        for (int j = 0; j < 2 ; j++) {
            for (int i = 0; i < 5; i++) {
                // Thread.currentThread().getName() 获取当前线程的名称
                System.out.println(Thread.currentThread().getName() + "-----" + i);
            }
            try {
                System.out.println(Thread.currentThread().getName() + "休眠中~");
                Thread.sleep(20000);// 20s
            } catch (InterruptedException e) {
                // 当线程执行到一个 interrupt方法时, 就会 catch一个异常, 可以加入自己的业务代码
                // InterruptedException 捕获到一个中断异常
                System.out.println(Thread.currentThread().getName() + "被interrupt了");
            }
        }
    }
}

运行结果:

setDaemon:

设置守护线程, 执行了setDaemon(true)的线程将被设置为守护线程, 在下面的代码示例中, 将子线程设置为守护线程, 相对的主线程就是用户线程, 当用户线程结束后, 守护线程将会自动结束

代码演示——setDaemon:

public class ThreadMethodDemo {
    public static void main(String[] args) throws InterruptedException {
        TestMethod testMethod = new TestMethod();
        // 如果希望 main线程结束后, 子线程自动结束
        // 只需要将子线程设置为守护线程即可
        // 守护线程会在用户线程结束后自动结束
        testMethod.setDaemon(true);
        testMethod.start();


        for (int i = 0; i < 5; i++) {
            System.out.println("主线程-----" + i);
            Thread.sleep(1000);
        }
    }
}

class TestMethod extends Thread {
    private int count = 0;

    @Override
    public void run() {
        // 无限循环
        while (true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("========" + ++count + "========");
        }
    }
}

运行结果:

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Black—slience

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值