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虚拟机中执行的线程处于此状态。

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值