多线程(2)

等待一个线程--join()

多线程之间并发执行,随机调度,但是join()的作用可以帮助我们控制线程结束的先后顺序。

join() 的优点

虽然我们可以通过sleep休眠来控制线程结束的顺序,但是我们设置时间来进行休眠等待的时候,由于无法确定时间线程执行的时间比我们设置的时间的长和短,导致出现没有必要的等待,或者线程没有完成,休眠会指定CPU等待的时间,导致CPU时间的浪费,而join()只会使当前的线程阻塞,直到任务的完成。

public class Demo12 {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("结束");
        });
        t.start();
        //意思为等到thread全部执行完,才开始执行main
        t.join();

        //得到一定的时间如果还没有等到thread执行完的话,就执行main
        //t.join(2000);

        System.out.println("main");
        //Thread.sleep(3000);

    }
}

我们可以观察一下线程

在main线程中t.join意思是让main线程等t线程先结束,当执行到t.join()使,main线程就会阻塞等待,一直到t线程执行完毕,join才会继续执行。

注:如果t线程一直不结束,join就会一直不执行

所以我们就要进行优化,给join加上最大的等待时间

如果2000毫秒之后,t线程还没有结束的话,那么就不进行等待开始执行main线程,(2000)就是最大的等待时间。

获得当前线程的引用

public static Thread currentThread()-获得当前线程的引用

 public class ThreadDemo {
 public static void main(String[] args) {
 Thread thread = Thread.currentThread();
 System.out.println(thread.getName());
 }
}

休眠当前的线程

在设置休眠的过程中,我们需要保证的一点是我们设置的休眠时间,实际上是要大于参数设置的休眠时间的。

实质:代码调用sleep,相当于让出了CPU资源,等到时间到了的时候,需要操作系统内核,把线程重新调度到CPU上,才能继续执行。

sleep(0)的作用:

让出了当前的线程,放弃了CPU资源,等待操作系统重新调度。(把CPU让出,给别人更多的执行机会)

进程状态

1.就绪   2.阻塞

NEW:表示安排了工作还未开始执行。(new了Thread对象,还没start)

TERMINATED:工作完成了(内核中的线程已经结束了,但是Thread对象还在)

TIMED_WAITING:这几个都表示排队等着其他事情

  • 指定时间阻塞
  • 线程阻塞(不参与CPU调度,不继续执行了)
  • 阻塞的时间是有上线的
public class Demo13 {
    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            for (int i = 0; i < 5; i++) {
                System.out.println("Thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        System.out.println(t.getState());
        t.start();
        Thread.sleep(500);
        System
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值