java 进阶—线程的常用方法

news2024/9/24 19:19:08

大家好,通过java进阶—多线程,我们知道的什么是进程,什么是线程,以及线程的三种创建方式的选择

今天,我们来看看线程的基础操作

  • start() 开启线程
public class Demo implements Runnable {


    @Override
    public void run() {
        for (int i = 0; i < 3; i++) {
            System.out.println("线程开启我就跑");
        }
    }

    public static void main(String[] args) {
        Demo  demo =new Demo();
        Thread thread =new Thread(demo);
         //开启线程        
         thread.start();
    }
}
  • currentThread() 返回当前线程

currentThread() 获取了当前线程,里面可以获取当前线程的名字

 1. getName(): 获取当前线程名字



 2.  getId(): 获取当前线程名字
public class Demo  implements  Runnable{


    @Override
    public void run() {
        System.out.println("当前线程:"+ Thread.currentThread());
        System.out.println("当前线程的名字:"+ Thread.currentThread().getName());
        System.out.println("当前线程的Id:"+ Thread.currentThread().getId());

    }

    public static void main(String[] args) {
         Demo demo =new Demo();
         Thread thread = new Thread(demo);
         thread.start();
    }
}

在这里插入图片描述
为什么是 默认是 Thread-0 ,是因为 Thread类里面的一个空参构造函数,

在这里插入图片描述
调用 nextThreadNum() 参数是从0 开始自增的

  • setName() 设置线程的名字
    觉得默认的 thread-0 名字不好?,没关系,我们可以自己设置 名字

public class Demo  implements  Runnable{


    @Override
    public void run() {
        System.out.println("当前线程:"+ Thread.currentThread());
        System.out.println("当前线程的名字:"+ Thread.currentThread().getName());

    }

    public static void main(String[] args) {
         Demo demo =new Demo();
         Thread thread = new Thread(demo);
         thread.setName("我设置的线程名字");
         thread.start();
    }
}

在这里插入图片描述

  • yield() 线程让步,释放当前CPU的执行

来看一个例子,主线程(mian)同 thread-0 线程 同时去执行 循环,去抢Cpu的执行权,我们在thread-0 线程加上 如果 循环出的值 %2 ==0 (是偶数)它就释放执行权


public class Demo implements Runnable {


    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            if (i % 2 == 0) {
                Thread.yield();
            }

        }
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        Thread thread = new Thread(demo);
        thread.start();
        for (int i = 0; i < 50; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
        }
    }
}

在这里插入图片描述

当然,释放执行权并不是一定,也是有概率的,有可能下一个执行权还是 thread-0

  • join() 让当前线程进入阻塞状态,被join线程执行完,再执行

举个例子:比如还是前面 thread-0 跟 主线程 抢占cpu执行权,现在我们在主线程中加一个 限制 条件,当主线程 循环到 10 时,让主线程进入阻塞状态,thread-0优先执行完,主线程再开始执行

public class Demo implements Runnable {


    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            if (i % 2 == 0) {
                Thread.yield();
            }

        }
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        Thread thread = new Thread(demo);
        thread.start();
        for (int i = 0; i < 50; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            if(i==10) {
                try {
                    thread.join();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

通过 thread-0线程去调用join方法 ,让 thread-0优先执行

在这里插入图片描述
在这里插入图片描述
可以看到 mian到了 10 时,就停止了,等thread-0 执行完,再开始

  • stop( ) 强制结束当前线程,方法已经过时,不建议使用 (开发中不要用)

  • sleep(毫秒值):让当前线程进入休眠时间,时间结束继续执行


public class Demo implements Runnable {


    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            if (i %2==0) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        Thread thread = new Thread(demo);
        thread.start();
        for (int i = 0; i < 50; i++) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }

    }
}

当阻塞时间结束,也并不是直接执行,也得dengCPU分配给你。你再执行,在阻塞时间内,cpu 想分配资源给你都不行

  • isAlive() 判断线程是否终止,这个线程是不是还活着
public class Demo implements Runnable {


    @Override
    public void run() {
        for (int i = 0; i < 50; i++) {
                System.out.println(Thread.currentThread().getName() + ":" + i);
            if (i %2==0) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

        }
    }

    public static void main(String[] args) {
        Demo demo = new Demo();
        Thread thread = new Thread(demo);
        thread.start();
        for (int i = 0; i < 50; i++) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + ":" + i);
        }
        System.out.println("线程是否还存活:"+thread.isAlive());

    }
}

执行结果:

在这里插入图片描述
解析(看的懂得小伙伴可以略过): 我们在主线程中,直接加了 join, 所以得等主线程执行完成再执行主线程,由于我们是在主线程之后加的判断线程 thread-0是否存活,这时候 thread-0 已经执行完任务了,生命周期结束,所以此时的thread-0 已经终止了

以上便是线程最常用方法了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382688.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五回:样式色彩秀芳华

import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np第五回详细介绍matplotlib中样式和颜色的使用&#xff0c;绘图样式和颜色是丰富可视化图表的重要手段&#xff0c;因此熟练掌握本章可以让可视化图表变得更美观&#xff0c;突出重点和凸显艺术性。…

施工机械设备群远程在线监控管理系统

一、项目背景 在加强基础设施建设等一系列政策的牵引下&#xff0c;我国工程机械设备市场连续保持强劲增长势头&#xff0c;伴随国内中高端机械设备公司业务的不断扩展&#xff0c;施工大型机械设备的应用率不断提高&#xff0c;铁路施工特别是架桥机作业过程被认为是一个极易出…

元宇宙到底是什么?元宇宙解读,这一篇就够了!

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;12分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 在元宇宙中&#xff0c;我们被承诺可以成为任何人&#xff0c;做任何事&#…

JavaSE20-集合1-list

文章目录一、集合概念二、list集合1、list集合特点2、ArrayList2.1 创建对象2.2 常用方法2.3 遍历2.3.1 使用索引遍历2.3.2 使用迭代器遍历2.3.3 使用foreach遍历2.3.4 集合转换为数组遍历3、LinkedList3.1 创建对象3.2 常用方法3.3 遍历4、ArrayList和LinkedList的区别一、集合…

支持DDR5,超频更简单,小雕够给力,技嘉B760M小雕WIFI主板上手

目前13代酷睿已经全员集结了&#xff0c;其中全新的i5 13490F应该依然会备受欢迎&#xff0c;当然了&#xff0c;刚上市不久的13代酷睿价格方面还不是很有吸引力&#xff0c;好在12代酷睿在新一代主板上面依然可用&#xff0c;所以预算有限的朋友&#xff0c;完全可用继续使用1…

原生微信小程序引入npm和安装Vant Weapp

目录一、引入npm安装Vant Weapp1、引入npm2、安装Vant Weapp3、修改 app.json4、修改 project.config.json二、构建npm一、引入npm安装Vant Weapp 环境&#xff1a;Windows10 开发工具&#xff1a;微信开发者工具 本地环境&#xff1a;已安装过node.js 1、引入npm cmd进入到你…

MyBatis源码分析(二、续)SqlSource创建流程,SQL如何解析?如何将#{id}变成?的

文章目录实例一、SqlSource处理入口二、SqlSource处理逻辑1、XMLScriptBuilder 构造方法2、解析动态sql3、DynamicSqlSource4、RawSqlSource解析sql&#xff08;1&#xff09;parse方法解析sql写在后面实例 此处我们分析的sql&#xff1a; <select id"selectBlog&quo…

|干货 | 五种常用类型之String字符串详解

一. 背景说明小白&#xff1a;哥&#xff0c;java中String是最常用类型&#xff0c;Redis中也是吗?哥&#xff1a;差不多&#xff0c;我给你稍微讲一下。二. 数据类型依据Redis官网&#xff0c;目前Redis数据类型共计九种。具体整理如下&#xff1a;常用的数据类型有&#xff…

第九章 实现isReactive和isReadonly

实现isReactive和isReadonly isReactive实现 先上测试用例&#xff08;其实这个测试用例也是reactive.spec.ts中追加的两个&#xff09;: import { isReactive, reactive } from "../reactive"describe(reactive,()>{it(happy path,()>{const original {fo…

taobao.item.sku.add( 添加SKU )

&#xffe5;开放平台免费API必须用户授权 新增一个sku到num_iid指定的商品中 传入的iid所对应的商品必须属于当前会话的用户 公共参数 请求地址: HTTP地址 http://gw.api.taobao.com/router/rest 公共请求参数: 公共响应参数: 请求参数 响应参数 点击获取key和secret 请求…

第十四节 包、权限修饰符、final、常量

包 1.同一个包下的类&#xff0c;相互可以直接访问。 2.不同包下的类要导包后才能访问。 AIT回车键导包。 权限修饰符 什么是权限修饰符? ●权限修饰符:是用来控制一个成员能够被访问的范围。 ●可以修饰成员变量&#xff0c;方法&#xff0c;构造器&#xff0c;内部类&…

并发就一定快吗?答:肯定不是啊

文章目录一、多线程概念1.1 程序的并发与并行1.1.1 程序的并行1.1.2 程序的并发1.2 进程与线程1.2.1 进程1.2.2 线程1.2.3 多线程并发就一定快吗&#xff1f;答案直接戳这里&#x1f449;&#xff1a;多线程并发就一定快吗&#xff1f; 一、多线程概念 在实际应用中&#xff…

车载测试之电子设备有哪些测试点?

现在车上大大小小的控制器大几十个&#xff0c;主机厂都要做哪些测试&#xff0c;满足哪些要求&#xff0c;才能使控制器达到量产要求呢&#xff1f; 整车开发流程 在聊测试之前&#xff0c;首先了解一下一款车的开发流程。在主机厂我们经常能听到“某某项目开G2阀”、“某某…

Java接口专题

基本介绍 接口给出一些没有实现的方法&#xff0c;封装到一起&#xff0c;到某个类使用时再根据具体情况把这些方法写出来。 注意&#xff1a;在jdk7之前&#xff0c;接口里所有的方法都是抽象方法。在jdk8之后接口中可以有静态方法&#xff0c;默认方法 interface 接口名{/…

Linux进程控制(进程终止+进程等待+进程程序替换)

文章目录&#xff1a;一、进程终止进程退出码常见的进程退出方法exit函数_exit函数returnexit vs _exit vs return二、进程等待进程等待的必要性进程等待的方法waitwaitpid - 从子进程获取状态信息如何获取子进程status进程的阻塞等待和非阻塞等待三、进程程序替换替换原理进程…

科技制造商必须对安全、设计选择承担更多责任

网络安全和基础设施安全局局长称当今商业网络安全的现状是"不可持续的"&#xff0c;公司、消费者和政府必须集体转变期望&#xff0c;让主要软件和硬件制造商对不安全的产品负责&#xff0c;而不是用户。 拜登政府预计将在未来几天发布一项战略&#xff0c;该战略将…

burp联动xray进行被动扫描

burp联动xray进行被动扫描0、简介1、打开burp&#xff0c;设置转发数据包&#xff0c;将burp抓到的数据包&#xff0c;额外转发到本机的7777端口2、出现这个代表配置成功3、接着在xray里输入这串代码&#xff0c;让xray进行监听本机的7777端口&#xff0c;进行被动扫描&#xf…

操作系统笔记、面试八股(二)—— 死锁

文章目录2. 死锁2.1 死锁的必要条件2.2 死锁预防2.3 死锁避免2.3.1 银行家算法2.4 死锁检测与死锁解除2.4.1 进程-资源分配图2.4.2 死锁检测的步骤2.4.3 死锁解除方法2. 死锁 2.1 死锁的必要条件 互斥 资源必须处于非共享模式&#xff0c;即因此只能有一个进程访问。如果有另一…

电脑崩溃蓝屏问题如何重装系统

电脑是我们日常生活和工作中必不可少的工具&#xff0c;但在使用过程中&#xff0c;难免会遇到各种问题&#xff0c;例如系统崩溃、蓝屏、病毒感染等&#xff0c;这些问题会严重影响我们的使用体验和工作效率。而小白一键重装系统可以帮助我们快速解决这些问题&#xff0c;本文…

精选博客系列|加速基于同态加密的隐私保护机器学习

随着机器学习在当今的企业和软件平台中的广泛使用&#xff0c;跨人工智能 &#xff08;AI&#xff09; 平台的隐私保护技术的解决方案也显得非常重要。虽然这个想法在今天看起来很明显&#xff0c;但人工智能研究社区历来更专注于打破数据孤岛的界限&#xff0c;并将数据从一个…