Java重修笔记 第五十五天 坦克大战(五)多线程基础

  • 线程常用方法
1. 设置线程的名称

        public final void setName(String name)

        参数:name - 这个线程的新名称

2. 得到线程的名称

        public final String getName()

        返回值:线程的名称

3. 创建线程

        public void start()

        Java 虚拟机底层调用 start0 方法创建线程

4. 设置线程的优先级

        public final void setPriority(int newPriority)

        参数:newPriority - 设置此线程的优先级

5. 得到线程的优先级

        public final int getPriority()

        返回值:这个线程的优先级

6. 线程休眠

        public static void sleep(long millis) throws InterruptedException

        参数:millis - 以毫秒为单位的睡眠时间长度

        异常:InterruptedException - 线程在休眠状态中被调用 interrupt 方法会抛出此异常

7. 中断线程

        public void interrupt()

        中断此线程,若该线程正在休眠,则会抛出 InterruptedException 异常来提前结束休眠状态

public class ThreadMethod01 {
    public static void main(String[] args) throws InterruptedException {
        T01 t01 = new T01();
        t01.setName("T01");
        t01.setPriority(Thread.MIN_PRIORITY);
        // System.out.println(t01.getPriority());
        t01.start();

        // 主线程打印5次后中断子线程的休眠
        for (int i = 0; i < 5; i++) {
            Thread.sleep(1000);
            System.out.println("hi " + i);
        }

        t01.interrupt();
    }
}

class T01 extends Thread {
    @Override
    public void run() {

        while (true) {
            for (int i = 0; i < 100; i++) {
                System.out.println(Thread.currentThread().getName() + "正在运行..." + i);
            }

            try {
                System.out.println(Thread.currentThread().getName() + "休眠~~~~");
                Thread.sleep(1000 * 20);
            } catch (InterruptedException e) {
                System.out.println(Thread.currentThread().getName() + "被 interrupt 了");
            }
        }

    }
}
8. 线程礼让

        public static void yield()

        尝试将此线程让出 CPU 资源去执行其他线程,若CPU资源不紧张,则可能礼让不成功,是否礼让取决于 CPU 同一调度

9. 线程插队

        public final void join() throws InterruptedException

        尝试优先执行此线程,一旦插队成功,则肯定会优先执行完插队的线程

         异常:InterruptedException - 线程在插队的状态中被调用 interrupt 方法会抛出此异常

public class ThreadMethod02 {
    public static void main(String[] args) {
        T02 t02 = new T02();
        Thread thread = new Thread(t02);
        try {
            for (int i = 1; i <= 10; i++) {
                System.out.println("hi " + i);
                Thread.sleep(1000);
                if (i == 5) {
                    thread.start();
                    thread.join();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("主线程结束... ");
    }
}

class T02 implements Runnable {

    @Override
    public void run() {
        try {
            for (int i = 1; i <= 10; i++) {
                System.out.println("hello " + i);
                Thread.sleep(1000);

            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("子线程结束... ");
    }
}
10. 设置守护线程

        public final void setDaemon(boolean on)

        将调用这个方法后将该线程标记为守护线程,当其他所有线程全部退出后,只剩下守护线程时,守护线程线程自动退出

       参数: - 如果 true ,将此线程标记为守护线程

11. 获取线程状态

        public Thread.State getState()

        返回值:返回线程的状态

  • 用户线程和守护线程
1. 用户线程

        也叫工作线程,只有当该线程执行完毕,或者以外部通知的方式才会结束

2. 守护线程

        一般为工作线程服务,只有当所有的用户线程结束后,守护线程最后才结束。常见的守护线程就是垃圾回收机制

3. 设置守护线程

        调用线程的 setDaemom 方法后,将该线程标记为守护线程,只有当其他用户线程全部退出以后,此线程自动最后退出

public class ThreadMethod03 {
    public static void main(String[] args) throws InterruptedException {
        MyDaemonThread myDaemonThread = new MyDaemonThread();
        // 想要在主线程结束后就把子线程也一起结束, 需要将主线程设置为子线程的守护线程
        // 守护线程要先设置在启动
        myDaemonThread.setDaemon(true);
        myDaemonThread.start();
        for (int i = 1; i <= 5; i++) {
            System.out.println("主线程正在执行 " + i);
            Thread.sleep(1000);
        }
    }
}

class MyDaemonThread extends Thread {
    @Override
    public void run() {
        while(true) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("工作线程正在执行中... ");
        }
    }
}

运行结果:

  • 线程状态

        尚未启动的线程处于此状态。

        在Java虚拟机中执行的线程处于此状态。

        被阻塞等待监视器锁定的线程处于此状态。

        正在等待另一个线程执行特定动作的线程处于此状态。

        正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。

        已退出的线程处于此状态。

本资源文件提供了一个基于STM32单片机的电子血压心率脉搏体温计模拟测量仪的完整解决方案。该系统结合了STM32单片机、LCD1602显示屏、DS18B20温度传感器、按键和电位器,实现了温度、心率和血压的测量,并通过Proteus软件进行了仿真。功能特点温度测量:通过DS18B20传感器实时测量当前体温,并将数据显示在LCD1602屏幕上。心率测量:通过按键模拟调节当前的心率脉搏,并将数据显示在LCD1602屏幕上。血压测量:通过电位器调节当前的血压值,经过STM32单片机ADC采集后,将数据显示在LCD1602显示屏上。报警功能:当温度、心率或血压超过预设阈值时,蜂鸣器会进行报警提醒。阈值可以在程序中进行更改。仿真演示本资源文件包含了详细的Proteus仿真文件和C语言源程序,用户可以通过仿真文件在Proteus软件中进行系统功能的验证和调试。使用说明软件环境:本设计使用C语言编程设计,程序代码采用Keil5编写,仿真采用Proteus软件进行仿真。程序打开方法:下载资料包后,建议解压到桌面上,避免文件路径太深导致程序打开异常。解压后使用Keil5打开程序。文件清单源程序代码Proteus仿真文件使用说明文档注意事项请确保在下载资料包后先解压,再使用Keil5打开程序。仿真过程中,可以通过按键和电位器调节心率和血压值,观察LCD1602屏幕上的显示变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值