多线程_04_常用方法

1:sleep()

sleep()方法属于Thread类,主要的作用是让当前线程停止执行,把cpu让给其他线程执行,但不会释放对象锁和监控的状态,到了指定时间后线程又会自动恢复就绪状态;
注意:线程睡眠到期自动苏醒,并返回到可运行状态,不是运行状态。sleep()中指定的时间是线程不会运行的最短时间。因此,sleep()方法不能保证该线程睡眠到期后就开始执行;

public class Demo4 extends Thread{

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if(i==4){
                try {
                    Thread.sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(i +"--"+ System.currentTimeMillis() + "--"+Thread.currentThread().getName());
        }
    }
}

class TestDemo4{
    public static void main(String[] args) {
        Demo4 t1 = new Demo4();
        t1.start();

        Demo4 t2 = new Demo4();
        t2.start();
    }
}

2:join()

让线程按顺序执行。
如果没有join方法,异步执行;

public class Demo5 extends Thread {

    @Override
    public void run() {
        System.out.println("run");
    }
}

class TestDemo5{
    public static void main(String[] args) throws InterruptedException {
        System.out.println("start");
        Demo5 t1 = new Demo5();
        t1.start();
        System.out.println("end");
    }
}

在这里插入图片描述
如果想改为同步执行;只需要添加join()
在这里插入图片描述
在这里插入图片描述

问题:有线程 t1 、t2 、t3 ,如何让线程安装顺序 t1–>t2–>t3 执行?

public class Demo5 extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 1000; i++) {
            System.out.println(i+"--"+Thread.currentThread().getName());
        }

    }
}

class TestDemo5{
    public static void main(String[] args) throws InterruptedException {
        Demo5 t1=new Demo5();
        t1.start();
        t1.join();
        Demo5 t2=new Demo5();
        t2.start();
        t2.join();
        Demo5 t3=new Demo5();
        t3.start();
        t3.join();
    }
}

3:yield()

一个线程调用yield()意味着告诉虚拟机自己非常乐于助人,可以把自己的位置让给其他线程(这只是暗示,并不表绝对)。但得注意,让出cpu并不代表当前线程不执行了。当前线程让出cpu后,还会进行cpu资源的争夺,但是能不能再次分配到,就不一定了;

public class Demo6 extends Thread {

    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            if(i == 2){
                this.yield();
            }
            System.out.println(i+"--"+Thread.currentThread().getName());
        }
    }
}

class TestDemo6{
    public static void main(String[] args) {
        Demo6 t1 = new Demo6();
        Demo6 t2 = new Demo6();
        t1.start();
        t2.start();
    }
}

4:isAlive()

判断线程是否处于活动状态。
如果是活动状态返回true,死亡状态返回false;

public class Demo6 extends Thread {

    @Override
    public void run() {
        System.out.println("3"+this.isAlive());
    }
}

class TestDemo6{
    public static void main(String[] args) throws InterruptedException {
        Demo6 t1 = new Demo6();
        System.out.println("1"+t1.isAlive());
        t1.start();
        System.out.println("2"+t1.isAlive());

    }
}

在这里插入图片描述

5:getName()和setName()

获取线程名和设置线程名

public class Demo6 extends Thread {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());//获取线程名
    }
}

class TestDemo6{
    public static void main(String[] args) throws InterruptedException {
        Demo6 t1 = new Demo6();
        t1.setName("t1");//设置线程名

        Demo6 t2 = new Demo6();
        t2.setName("t2");

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

    }
}

6:getPriority()和setPriority()

用来获取和设置线程优先级。

1:记住当线程的优先级没有指定时,所有线程都携带普通优先级。
2:优先级可以用从1到10的范围指定。10表示最高优先级,1表示最低优先级,5是普通优先级。
3:记住优先级最高的线程在执行时被给予优先。但是不能保证线程在启动时就进入运行状态。:由调度程序决定哪一个线程被执行。
4:t.setPriority()用来设定线程的优先级。
5:记住在线程开始方法被调用之前,线程的优先级应该被设定。
6:你可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY来设定优先级。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37392489/article/details/86509687
04_