线程的学习

  • 在单线程的时候,一个程序就是在一个栈里面执行方法,所有的方法不断地在栈内存中压栈出栈,执行的速度慢

  • 在多线程的程序中,一个程序可以分为多个线程,一个线程占用一片栈内存,每新开一个线程,就是JVM新开了一片栈内存给我们执行程序,执行完毕之后回收。执行速度快。

  • 在这里插入图片描述

  • 获取线程的名称
  1. 使用thread类中的方法String getName() 返回该线程的名称

  2. 先获取当前正在执行的线程,再使用线程的方法getName()也可以拿到名称,static Thread currentThread()可以获取到正在执行的线程

    public class myThread extends Thread{
        public void run(){
            //第一种方式获取并打印线程名称
            System.out.println(getName());
            //第二种方式
            Thread t=Thread.currentThread();
            System.out.println(t.getName());
        }
    }
    
  • 设置线程的名字
  1. 通过构造函数设置

    首先设置构造函数,一个无参构造,一个有参构造,有参构造里面调用父类的有参构造

  2. 通过setName设置

    直接在new一个线程之后通过setName方法设置

    //myThread类
    public class myThread extends Thread{
        public myThread() {
        }
    
        public myThread(String name) {
            super(name);
        }
    
        public void run(){
            Thread t=Thread.currentThread();
            System.out.println(t.getName());
        }
    }
    
    
    //测试类
    public class Test {
        public static void main(String[] args) {
           myThread th=new myThread("zs");
           th.start();
           myThread th1=new myThread();
           th1.setName("ls");
           th1.start();
        }
    }
    
    
  • sleep方法
  1. public static void sleep(long millis) 使得当前线程睡眠millis毫秒之后继续执行

  2. 下面利用sleep方法做一个模拟的秒表

    //myThread类
    public class myThread extends Thread{
        public void run(){
            for (int i=1;i<=60;i++){
                try {
                    Thread.sleep(1000);
                }catch(InterruptedException e)
                {
                    e.printStackTrace();
                }
                System.out.println(i);
            }
        }
      
      //测试类
      public class Test {
        public static void main(String[] args) {
           myThread th=new myThread();
           th.start();
        }
    }
    
    
  • 使用Runnable实现多线程
  1. 实现一个Runnable接口的实现类

  2. 在实现类中重写Runnable接口的run方法,设置线程任务

  3. 设置一个实现类的实例对象

  4. 创建一个Thread类对象,构造方法中传递Runnable实现类的实例对象

  5. 调用Thread类的start方法开启线程

    //Runnableimpl类
    public class Runnableimpl implements Runnable{
        public void run(){
            for (int i=1;i<=10;i++)
            {
                System.out.println(Thread.currentThread().getName()+","+i);
            }
        }
    }
    //测试类
    public class Test {
        public static void main(String[] args) {
            Runnableimpl im=new Runnableimpl();
           Thread th=new Thread(im);
           th.start();
            for (int i = 1; i <=10; i++) {
                System.out.println(Thread.currentThread().getName()+","+i);
            }
        }
    }
    
  • 使用Runnable而不是Thread的好处?

  • 一个类只能继承自一个父类,我自己写的子类继承了Thread类之后就不能再继承其他类了

  • 而使用在实现类中重写Runnable接口之后,我还可以实现其它接口

  • 这样做,我就可以增强程序的拓展性,降低了程序的耦合性

  • 匿名内部类的方式创建线程

  1. 作用:简化代码
  2. 格式:new 父类/接口(){ 重写父类、接口中的方法 };
public class Test {
    public static void main(String[] args) {
        //继承的方式
        Thread th=new Thread(){
            @Override
            public void run() {
                for (int i = 0; i < 30; i++) {
                    System.out.println("第一种"+i);
                }
            }
        };

        //实现类的方式
        Thread th1=new Thread(
                new Runnable() {
                    @Override
                    public void run() {
                        for (int i=0;i<10;i++)
                            System.out.println("第二种"+i);
                    }
                }
        );
        th.start();
        th1.start();
    }
}

  • 上面的代码中,我可以不接收new出来的Thread,而是直接在new之后直接利用.start()方法开启线程,但是这样做之后,由于第二个线程在第一个线程执行完之前并没有new出来,那么也就不会被执行,所以这里只是单线程,而像我上面代码写的那样使用Thread对象接收,最后再start,就可以两个线程一起启动。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java基础教程】(五十)JDBC篇:JDBC概念及操作步骤、主要类与接口解析、批处理与事务处理~

Java基础教程之JDBC &#x1f539;本章学习目标1️⃣ JDBC概念2️⃣ 连接数据库3️⃣ Statement 接口3.1 数据更新操作3.2 数据查询 4️⃣ PreparedStatement 接口4.1 Statement 接口问题4.2 PreparedStatement操作 5️⃣ 批处理与事务处理&#x1f33e; 总结 &#x1f539;本…

Grandle安装配置(8.2.1)-windows环境

一、官网地址 https://gradle.org/releases/ 下载链接&#xff1a; https://downloads.gradle.org/distributions/gradle-8.2.1-bin.zip 下载后解压到指定文件夹,实例安装目录为&#xff1a; D:\ProgramFiles\gradle-8.2.1 二、配置环境变量 示例中配置的目录为&#xff1a…

服务器出入口IP通俗理解

一、出口IP 这是机房的网络设备&#xff08;如防火墙&#xff09;给内网主机生成的一个外网IP&#xff0c;用来保证内网主机能和其他公网主机进行来回通信&#xff0c;通常作为其他接入方的IP白名单使用&#xff0c;一般有几台内网主机就有几个出口IP&#xff0c;出口IP通常和入…

基于SSM家电补贴一站式服务平台-计算机毕设 附源码12305

ssm家电补贴一站式服务平台 摘 要 近年来&#xff0c;随着移动互联网的快速发展&#xff0c;电子商务越来越受到网民们的欢迎&#xff0c;电子商务对国家经济的发展也起着越来越重要的作用。简单的流程、便捷可靠的支付方式、快捷畅通的物流快递、安全的信息保护都使得电子商务…

无涯教程-Lua - 条件判断

if结构要求程序员确定一个或多个要由程序判断或测试的条件&#xff0c;以及要确定的条件为真的情况下要执行的一条或多条语句&#xff0c;如果条件为真&#xff0c;则执行指定语句&#xff0c;如果条件为假&#xff0c;则执行其他语句。 Lua编程语言假定布尔值 true 和 non-nil…

【硬件设计】模拟电子基础一--元器件介绍

模拟电子基础一--元器件介绍 一、半导体&#xff08;了解&#xff09;1.1 基础知识1.2 PN结 二、二级管2.1 定义与特性2.2 二极管的分类 三、三级管四、MOS管三、其他元器件管3.1 电容3.2 光耦3.3 发声器件3.4 继电器3.5 瞬态电压抑制器 前言&#xff1a;本章为知识的简单复习&…

蓝桥云课ROS机器人旧版实验报告-01入门

项目名称 实验一 ROS[Kinetic/Melodic/Noetic]入门 成绩 设计要求&#xff1a; 机器人操作系统安装、虚拟机、Docker、嵌入式系统 实验记录&#xff08;70分&#xff09; 1.以 $ 开头的行是终端命令。 - 要打开一个新终端 → 使用快捷键 ctrlaltt。 - 要在现有终端内…

C语言结构体讲解

目录 结构体的声明 结构的基础知识 结构的声明 为什么要出现结构体&#xff1f; 结构成员的类型 结构体变量的定义和初始化 定义&#xff1a;&#xff08;全局变量//局部变量&#xff09; 初始化&#xff1a; 结构体成员的访问 结构体传参 结构体的声明 结构的基础知识…

你真的会自动化吗?Web自动化测试-PO模式实战,一文通透...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 PO模式 Page Obj…

C# Socket实际应用案例与属性详解

引言 Socket是一个在网络编程中非常常见和重要的概念&#xff0c;它提供了一种通信机制&#xff0c;使不同的计算机之间可以进行数据传输。本文将介绍C#中Socket的实际应用案例&#xff0c;并对Socket的常用属性进行详细解析。 文章目录 1. Socket的实际应用案例2. Socket的属…

【Lua学习笔记】Lua进阶——协程

文章目录 协程协程的定义和调度wrap StatusRunning补充 协程与主程的数据交互——return...yield 协程 协程是一种并发操作&#xff0c;相比于线程&#xff0c;线程在执行时往往是并行的&#xff0c;并且线程在创建销毁执行时极其消耗资源&#xff0c;并且过长的执行时间会造成…

统一观测|借助 Prometheus 监控 ClickHouse 数据库

引言 ClickHouse 作为用于联机分析(OLAP)的列式数据库管理系统(DBMS), 最核心的特点是极致压缩率和极速查询性能。同时&#xff0c;ClickHouse 支持 SQL 查询&#xff0c;在基于大宽表的聚合分析查询场景下展现出优异的性能。因此&#xff0c;获得了广泛的应用。本文旨在分享阿…

CentOS7.3 安装 docker

亲测、截图 阿里云服务器 文章目录 更新源2345 启动开机自启 更新源 sudo yum update -y2 sudo yum install -y yum-utils device-mapper-persistent-data lvm23 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo4 sudo yum …

计数排序算法

计数排序 计数排序说明&#xff1a; 计数排序&#xff08;Counting Sort&#xff09;是一种非比较性的排序算法&#xff0c;它通过统计元素出现的次数&#xff0c;然后根据元素出现的次数将元素排列在正确的位置上&#xff0c;从而实现排序。计数排序适用于非负整数或者具有确…

算法综合篇专题一:双指针问题

"就算没有看清那株灿烂的花蕊&#xff0c;也应该放声歌颂赞美鲜红的玫瑰" 1、移动零 (1) 题目解析 (2) 算法原理 class Solution { public:void moveZeroes(vector<int>& nums) {for(int cur0,dest-1;cur<nums.size();cur){if(nums[cu…

保姆级秋招教程之简历篇

大家好&#xff0c;我是千寻哥&#xff0c;个人简历在程序员求职过程中扮演着至关重要的角色。 今天我将详细给大家介绍一下写简历的必备要素和布局&#xff0c;同时强调应避免的“坑”&#xff01; 希望能通过这些技巧&#xff0c;能帮助程序员打造一份出色的简历&#xff0c;…

WEB:mfw

背景知识 Git泄露 Githack使用 命令执行漏洞 题目 这里页面里有Git&#xff0c;猜测是Git泄露 先用dirsearch扫一下 确实存在.git目录&#xff0c;可以尝试访问一下 使用Githack来下载并恢复.git文件 这里记得使用的时候关闭杀毒软件 结果会自动保存 点进去先看一下flag这个…

【前端知识】React 基础巩固(四十二)——React Hooks的介绍

React 基础巩固(四十二)——React Hooks的介绍 一、为什么需要Hook? Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下使用state以及其他的React特性&#xff08;比如生命周期&#xff09;。 class组件 VS 函数式组件&#xff1a; class的优势…

【机器学习】Feature scaling and Learning Rate (Multi-variable)

Feature scaling and Learning Rate 1、数据集2、学习率2.1 α \alpha α 9.9e-72.2 α \alpha α 9e-72.3 α \alpha α 1e-7 3、特征缩放3.1 特征缩放的原因3.2 Z-score 归一化3.3 预测3.4 损失等值线 导入所需的库 import numpy as np np.set_printoptions(precision…

为Win12做准备?微软Win11 23H2将集成AI助手:GPT4免费用

微软日前确认今年4季度推出Win11 23H2&#xff0c;这是Win11第二个年度更新。 Win11 23H2具体有哪些功能升级&#xff0c;现在还不好说&#xff0c;但它会集成微软的Copilot&#xff0c;它很容易让人想到多年前的“曲别针”助手&#xff0c;但这次是AI技术加持的&#xff0c;Co…