• java线程控制


    java线程控制的语法很多 这里我们主要说以下三个方法
    在这里插入图片描述

    我们先新建一个包

    包下建立两个类
    customException 线程类
    参考代码如下

    public class customException extends Thread {
        public String name;
    
        public customException(){
    
        }
        public void run(){
            for(int i = 0;i < 100;i++){
                System.out.println(getName()+"第"+(i + 1)+"次输出");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    text 测试类
    参考代码如下

    public class text {
        public static void main(String args[]) {
            customException com1 = new customException();
            customException com2 = new customException();
            customException com3 = new customException();
            com1.setName("刘备");
            com2.setName("孙权");
            com3.setName("曹操");
            com1.start();
            com2.start();
            com3.start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    然后 我们运行代码
    在这里插入图片描述
    我们可以看到 曹操既然没有干过刘备和孙权
    把记录往上翻
    在这里插入图片描述
    我们看到 刚开始 我们的孙权也是非常的给力 但再执行一次 你会发现 他们谁快谁慢 完全是随机的

    但按照历史 孙权和刘备应该要慢一些

    我们改写 customException 类中的 run方法如下

    public class customException extends Thread {
        public String name;
    
        public customException(){
    
        }
        public void run(){
            for(int i = 0;i < 100;i++){
                if(getName() == "孙权"||getName() == "刘备") {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(getName()+"第"+(i + 1)+"次输出");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    这里我们取getName方法 就是获取当前的线程名称 判断 如果是 孙权或刘备 则 执行Thread中的sleep 里面是休眠的时间数
    这样 每次孙权和刘备的线程执行时 都会先休眠一秒

    我们运行代码如下
    在这里插入图片描述
    这里我们可以看到 曹操都跑完了 孙权和刘备总共也没执行几次 甚至才刚开始

    因为他们每次执行都会先休眠一秒 而在计算机中 一秒可以做非常非常多的事

    这就是sleep线程休眠的语法

    我们去customException类中
    把刚写的休眠代码去掉

    然后我们改一下测试类的线程名称
    在这里插入图片描述
    康熙 四阿哥 八阿哥

    这是一场皇位争夺战 但他们如果一起执行 谁快谁慢都不好说

    但康熙是他们的父亲 啊 要等康熙挂了 他们才能开始抢啊

    我们修改测试类main方法如下

    public static void main(String args[]) {
       customException com1 = new customException();
       customException com2 = new customException();
       customException com3 = new customException();
       com1.setName("康熙");
       com2.setName("四阿哥");
       com3.setName("八阿哥");
       com1.start();
       try {
           com1.join();
       } catch (InterruptedException e) {
           e.printStackTrace();
       }
       com2.start();
       com3.start();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    join方法就会强行控制 com1线程走完之后 其他线程才能继续执行
    在这里插入图片描述
    这就是第二个语法 强行 指定某个线程执行完毕 其他线程才能接着往下走

    然后我们更改 customException 线程类的代码如下

    public class customException extends Thread {
        public String name;
        public int age;
    
        public customException(int age){
            this.age = age;
        }
        public void run(){
            for(int i = 0;i < age;i++){
                System.out.println(getName()+"第"+(i + 1)+"次输出");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    text测试类 代码如下

    public class text {
        public static void main(String args[]) {
            customException com1 = new customException(10);
            customException com2 = new customException(100);
            customException com3 = new customException(100);
            com1.setName("总统");
            com2.setName("保镖");
            com3.setName("助理");
            com1.start();
            com2.start();
            com3.start();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这是可以看到 我们将线程的次数 改成了 用age变量控制 而这个变量是customException构造函数中控制的
    而我们总统传了 10 保镖和助理传了一百

    在这里插入图片描述
    执行之后 理所当然 总统执行了10次 但其他两个执行了 100次
    但总统退休了 他们也就改退休了啊

    我们这里改写text类中的main方法

    public static void main(String args[]) {
        customException com1 = new customException(10);
        customException com2 = new customException(100);
        customException com3 = new customException(100);
        com1.setName("总统");
        com2.setName("保镖");
        com3.setName("助理");
        com1.start();
        com2.setDaemon(true);
        com3.setDaemon(true);
        com2.start();
        com3.start();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    这是 我们将 com2和com3 都设置成立守卫线程 主线程结束之后 他们也会结束 我们运行代码
    在这里插入图片描述
    我们可以看到 保镖和助理执行了十几次也停了 因为主线程已经结束了
    有些人就会说 主线程结束 他们不应该立马结束吗?
    主线程结束 守卫线程还有一点反应时间才结束
    这样总统退休 保镖和助理也就光荣下岗啦

  • 相关阅读:
    【附源码】计算机毕业设计SSM社交网络数据采集系统
    Graphviz 可视化图形软件(python)
    HTML网页设计——轮滑运动体育类人物介绍主题12页面毕业设计网页
    科学数据分析和图形绘制软件GraphPad Prism 9 mac中文版特点介绍
    光谱数据处理:1.特征波长优选的不同方法与Python实现
    2022牛客暑期多校训练营9(总结+补题)
    在印度与软件相关的发明可不可以申请专利?
    docker.6-Dockerfile精讲及新型容器镜像构建技术
    redis的一些操作
    React中redux的使用之redux的简单理解,以及创建并使用一个精简版的redux
  • 原文地址:https://blog.csdn.net/weixin_45966674/article/details/127936587