Java基础—多线程(第三节)

1. sleep
  • sleep(时间) 指定当前线程阻塞的毫秒数
  • sleep时间达到后线程进入就绪状态
  • sleep可以模拟网络延时,倒计时等
/**
 - sleep模拟倒计时
 */
public class BlockedSleep02 {
    public static void main(String[] args) throws InterruptedException {
        //倒计时
        Date endTime = new Date(System.currentTimeMillis()); //当前时间
        long end = endTime.getTime();
        while (true){
            System.out.println(new SimpleDateFormat("yyyy:hh:mm:ss").format(endTime));//输出当前时间
            Thread.sleep(1000);//延时一秒
            endTime = new Date(endTime.getTime()-1000);//减一秒
            if(end-10000>endTime.getTime()){
                break;
            }
        }
    }
    public static void test() throws InterruptedException {
        //倒数10个数 1秒一个
        int num=10;
        while (true){
            Thread.sleep(1000);
            System.out.println(num--);
        }
    }
}

结果:
在这里插入图片描述

2. join
  • 线程A在运行期间,可以调用线程B的join()方法,让线程B和线程A联合。这样,线程A就必须等待线程B执行完毕后,才能继续执行。
/**
 * join:合并线程,插队线程
 */
public class BlockJoin01 {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            for(int i=0;i<100;i++){
                System.out.println("lambda..."+i);
            }
        });
        t.start();
        for (int i=0;i<100;i++){
            if (i==5){
                t.join();//插队,main被阻塞了
            }
            System.out.println("main..."+i);
        }
    }
}

结果:可以看到当main到4的时候,被阻塞了,开始运行lambda
在这里插入图片描述

3. yield
  • 礼让线程,让当前正在执行的线程暂停
  • 不是阻塞线程,而是将线程从运行状态转入就绪状态
  • 让CPU调度器重新调度
4. priority
  • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程。线程调度器按照线程优先级决定应调度哪个线程来执行
  • 线程的优先级用数字表示,范围从1到10
  • Thread.MIN_PRIORITY=1
  • Thread.MAX_PRIORITY=10
  • Thread.NORM_PRIORITY=5
    优先级的设定在start()调用前
    注意:优先级只是意味着获得调度的概率低,并不是绝对先调用优先级高后调用优先级低的进程。
/**
 - //线程的优先级
 - 1.NORM_PRIORITY  5 默认的优先级为5
 - 2.MIN_PRIORITY   1
 - 3.MAX_PRIORITY   10
 *优先级低只是意味着获得调度的概率低,并不是绝对先调用优先级高后调用优先级低的线程
 */
public class PriorityTest {
    public static void main(String[] args) {
        System.out.println(Thread.currentThread().getPriority());
        MyPriority myPriority = new MyPriority();
        Thread t1 = new Thread(myPriority,"王鸥");
        Thread t2 = new Thread(myPriority,"张韶涵");
        Thread t3= new Thread(myPriority,"肖战");
        //设置优先级在启动前
        t1.setPriority(Thread.MAX_PRIORITY);
        t2.setPriority(Thread.MIN_PRIORITY);
        t3.setPriority(Thread.MIN_PRIORITY);
        t1.start();
        t2.start();
        t3.start();
    }
}
class MyPriority implements Runnable{
    @Override
    public void run() {
        Thread.yield();
        System.out.println(Thread.currentThread().getName()+"--->"+Thread.currentThread().getPriority());
    }
}

结果:可以看到并不是优先级高的先执行
在这里插入图片描述

5. 用户线程和守护线程
  • 线程分为用户线程和守护线程
  • 守护线程(Daemon线程):指在程序运行的时候在后台提供一种通用服务的线程,它主要被用作程序中后台调度以及支撑性工作,这种线程不是程序中不可或缺的部分。因此,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出。同时会杀死进程中的所有守护线程。只要任何非Daemon还在运行,程序就不会终止。
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕
  • 守护线程的唯一用途就是为其他线程提供服务
  • 当只剩下守护线程时,虚拟机就会退出
  • void setDaemon(boolean isDaemon)设置该线程为守护线程还是用户线程。这一方法必须在线程启动之前调用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值