线程的几种方法

目录

线程状态

线程的几种方法

停止线程

在java中有三种方法可以停止线程,推荐线程自己停下来

  1. 使用退出标志,让线程正常退出,也就是当run方法执行完之后终止
  2. 使用stop方法强制终止线程,但是不推荐使用,因为stop和suspend及resume一样,是java废弃的方法
  3. 使用interrupt方法中断线程

示例代码:使用标志位使线程停止,main和Thread交替进行

public class TestStop implements Runnable {

    private boolean flag = false;

    public static void main(String[] args) {
        TestStop stop = new TestStop();
        new Thread(stop).start();

        for (int i = 0; i < 1000; i++) {
            System.out.println("main i:"+i);
            if (i==300) {
                stop.changeStop();
                System.out.println("线程停止了...");
            }
        }
    }

    public void changeStop() {
        this.flag = !this.flag;
    }

    @Override
    public void run() {
        int i = 0;
        while (!flag) {
            System.out.println("Thread run "+i+++"...");
        }
    }
}

sleep

sleep(int millsecond): 优先级高的线程可以在它的run()方法中调用sleep方法来使自己放弃CPU资源,休眠一段时间。

作用:放大问题的发生性

示例代码:模拟倒计时

public static void main(String[] args) {
    try {
        daoJiShi();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
// 模拟倒计时
public static void daoJiShi() throws InterruptedException {
    int num = 10;
    while (num>-1) {
        System.out.println(num--);
        Thread.sleep(1000); // 1秒
    }
}

yield

礼让进程,让 当前正在执行的进程暂停,但不阻塞。

将线程从运行状态转为就绪状态。

让cpu重新调度,礼让不一定成功!看cpu心情

实例代码:

public class TestYield {

    public static void main(String[] args) {
        MyYield myYield = new MyYield();
        new Thread(myYield, "A").start();
        new Thread(myYield, "B").start();
    }
}

class MyYield implements Runnable {
    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name+"开始执行...");
        Thread.yield(); //礼让
        System.out.println(name+"结束执行...");
    }
}

运行截图:

礼让成功截图:

线程的几种方法

礼让失败截图:

线程的几种方法

join

join合并线程,待此线程执行完后,再执行其他线程。

实例代码:

public class TestJoin implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println("VIP 来了 i:"+i+"...");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        TestJoin join = new TestJoin();
        Thread thread = new Thread(join);
        thread.start();

        // 主线程
        for (int i = 0; i < 200; i++) {
            if (i==120)
                thread.join(); // 插队
            System.out.println("in main "+i+"...");
        }
    }
}

引用资料

【狂神说Java】多线程详解

Java——多线程之方法详解

Java线程常用方法详解

上一篇:递归-方法自己调用自己


下一篇:0ctf_2017_babyheap