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

线程

当点击运行按钮运行程序时,就相当于启动了一个进程,虚拟机进入 mian 方法后会开启一个名为 mian 的主线程,main 方法体中创建一个线程对象,调用该线程对象的 start 方法又创建一个子线程,子线程的启动并不会阻塞主线程剩余代码继续执行

主线程结束后并不会影响进程的结束,只有当该进程下的所有线程全部结束后,该进程才会结束。

Jconsole 工具的使用

在程序运行时,打开下面的 Terminal 终端显示框,输入 Jconsole 便可打开监视和管理控制台,其中便可找到对应线程查看状态。

若无法看到本地线程,可参考以下文章解决:

运行jconsole无法看到本地进程_jconsole找不到本地进程-CSDN博客文章浏览阅读1.2k次,点赞3次,收藏3次。设置完全控制_jconsole找不到本地进程https://blog.csdn.net/weixin_49107940/article/details/127963204

关于 start 方法

只有调用线程对象 start 方法才能创建出一个子线程,子线程不影响主线程的执行,如果只调用线程对象的 run 方法,那就不会创建新线程,还是在主线程中运行,阻塞主线程直到 run 方法执行完毕。

start 方法底层会调用 start0 方法,此方法才真正实现多线程的效果。当然 start0 并不会直接创建线程,而是将线程的状态改变为"可运行状态",具体什么时候执行,取决于CPU统一调度。

创建线程
1. 通过继承 Thread 类来创建线程
(1)让对象类继承 Thread 类,而 Thread 类实现了 Runnable 接口,该类就可以当做一个线程使用
(2)重写 Runnable 接口里的 run 方法,在方法体中写上自己的业务逻辑
(3)创建线程类对象,调用线程类对象的 start 方法来启动该线程,启动子线程后并不会阻塞主线程下面的代码继续执行
java 复制代码
public class Thread01 {
    public static void main(String[] args) {
        Cat cat = new Cat();
        cat.start();
        try {
            for (int i = 0; i < 10; i++) {
                Thread.sleep(1000);
                System.out.println("主线程输出第" + i + "次");
            }
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }
    }
}

class Cat extends Thread {

    private static int count;

    @Override
    public void run() {
        do {
            count++;
            System.out.println("第" + count + "次输出, 线程名为: " + Thread.currentThread().getName());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }
        } while (count != 80);
    }
}
2. 通过实现 Runnable 接口来创建线程
(1)让对象类实现 Runnable 接口
(2)重写 Runnable 接口里的 run 方法,在方法体中写上自己的业务逻辑
(3)创建线程类对象,然后创建 Thread 类对象,把线程类对象作为参数放到 Thread 类的构造方法中(静态代理模式)
(4)调用 Thread 类对象的 start 方法
java 复制代码
public class Thread02 {
    public static void main(String[] args) {
        new Thread(new Dog()).start();
    }
}

class Dog implements Runnable {

    public static int count = 0;

    @Override
    public void run() {
        try {
            do {
                count++;
                System.out.println("第" + count + "次输出, 线程名为: " + Thread.currentThread().getName());
                Thread.sleep(1000);
            } while (count < 80);
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }
    }
}
线程退出-通知方式

简单来说就是在线程类中设置一个变量,并向外暴露修改方法,通过线程对象的 set 方法来操作这个变量,以实现手动控制 run 方法退出这个子线程。

java 复制代码
public class ThreadExit_ {
    public static void main(String[] args) {
        MyThread04 myThread04 = new MyThread04();
        myThread04.start();
        // 主线程休眠 10 秒后退出子线程
        try {
            Thread.sleep(1000 * 10);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        myThread04.setLoop(false);
    }
}

class MyThread04 extends Thread {

    private boolean loop = true;

    private int count = 0;

    public boolean isLoop() {
        return loop;
    }

    public void setLoop(boolean loop) {
        this.loop = loop;
    }
    
    @Override
    public void run() {
        try {
            while (loop) {
                if (count++ == 1000) {
                    break;
                }
                Thread.sleep(100);
                System.out.println(Thread.currentThread().getName() + "运行中... " + count);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
相关推荐
圆头圆脑圆JAVA5 分钟前
MQ(RabbitMQ)笔记
笔记·rabbitmq·java-rabbitmq
慢慢雨夜23 分钟前
uniapp 苹果安全域适配
java·前端·uni-app
mit6.82427 分钟前
[Linux#49][UDP] 2w字详解 | socketaddr | 常用API | 实操:实现简易Udp传输
linux·网络·c++·笔记·后端
敲代码不忘补水28 分钟前
二十种编程语言庆祝中秋节
java·javascript·python·golang·html
码农研究僧42 分钟前
Java或者前端 实现中文排序(调API的Demo)
java·前端·localecompare·中文排序·collator
Chase-Hart42 分钟前
【每日一题】LeetCode 7.整数反转(数学)
java·数据结构·算法·leetcode·eclipse
scdifsn1 小时前
动手学深度学习8.5. 循环神经网络的从零开始实现-笔记&练习(PyTorch)
pytorch·笔记·rnn·深度学习·梯度剪裁
四角小裤儿儿1 小时前
Java数据结构(十一)——归并排序、计数排序
java·数据结构·排序算法
guangzhi06331 小时前
JVM垃圾回收器
jvm
guangzhi06331 小时前
JVM本地方法栈
java·jvm·面试