睡眠阻塞&中断睡眠阻塞&线程优先级

线程中的几个概念
线程调度机制:统一管理所有线程,分配cpu时间片给需要并发操作的线程时间,获取时间片的线程被cpu执行
时间片:时间片段,就是一个线程能被cpu执行的时间.获得cpu的时间片的线程进入running状态
线程:需要并发运行的任务.
线程start()方法:将线程纳入到线程调度机制,得已并发操作.

线程中和生命周期相关的几个方法
staitc void sleep(long time):使当前线程进入睡眠阻塞.休眠指定的time毫秒,休眠结束后重新回到runnable状态,等待再次获取cpu时间片并发运行

线程睡眠阻塞演示

import java.text.SimpleDateFormat;
import java.util.Date;

public class SleepBlockDemo {
    public static void main(String[] args) throws InterruptedException{
        /*
        每秒钟输出一次当前系统时间
         */
        SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
        for(;;){

            System.out.println(sdf.format(new Date()));
            for(int i=0;i<8;i++){
                System.out.println();
            }
            //停顿一秒钟
            Thread.sleep(1000);
        }
    }
}

void interrupt():中断线程,若线程处于睡眠阻塞时将该线程中断,会引发中断异常.InterruptedException

main方法实际上也是一个线程在运行的.
当我们运行一个java程序时,操作系统会启动一个进程来运行这个程序,而虚拟机启动起来后,会创建一个线程去执行main方法.

中断睡眠阻塞

>public class InterruptSleepBlockDemo {
    public static void main(String[] args) {
        /*
        小品:砸墙
         */
        Thread lin=new Thread(()->{
                System.out.println("林:刚美完容,睡觉了.");
                try{

                    /*
                    当前线程进入睡眠阻塞后,若被其他线程中断,这里就会引发中断异常.
                     */
                    Thread.sleep(1000000);
                }catch(InterruptedException e){
                    //e.printStackTrace();
                    System.out.println("干嘛呢!干嘛呢!都破了相了都!");
                }

        });
        Thread huang=new Thread(()->{
                        for(int i=0;i<5;i++){
                            System.out.println("黄:八十!");
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                        System.out.println("黄:搞定!");
                        //中断lin线程
                        /*
                        一个方法中的局部内部类中若想引用该方
                        法的其他局部变量,那么被引用的变量
                        应该是final的
                         */
                        lin.interrupt();

                }
        );
        lin.start();
        huang.start();
    }
}

final void setPriority(int p):设置线程的优先级.优先级越高的线程理论上被分配的时间片的机会越多.
优先级的取值范围:
常量:Max_PRIORITY 最高优先级,值为10
MIN_PRIORITY 最低优先级,值为1
NORM_PRIORITY 默认优先级,值为5

线程优先级
设置优先级相当于求求线程先执行,看心情,他可能不会先执行你

>public class PriorityDemo {
    public static void main(String[] args) {
        Thread max=new Thread(()->{
            for(int i=0;i<10000;i++){
                System.out.println("我\"可能\"最快!");
            }
        });
        Thread min=new Thread(()->{
            for(int i=0;i<10000;i++){
                System.out.println("我\"可能\"最慢");
            }
        });
        Thread nor=new Thread(()->{
            for(int i=0;i<10000;i++){
                System.out.println("我\"可能\"不快也不慢");
            }
        });
        //设置最高优先级
        max.setPriority(Thread.MAX_PRIORITY);
        //设置最低优先级
        min.setPriority(Thread.MIN_PRIORITY);
        //不设置就是默认优先级,不过为了练习还是写一下
        nor.setPriority(Thread.NORM_PRIORITY);
        min.start();//放入并发
        nor.start();//放入
        max.start();

    }
}

使用线程,不应该纠结线程执行的先后顺序.因为是不确定的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值