当前位置: 首页 > news >正文

Java—实现多线程程序 | 入门

 

目录

一、前言

二、基本概念

进程

 线程

三、Java多线程实现

java.lang.Thread类

获取线程名字及对象

获取main进程名

Thread currentThread()

四、线程优先级 

设置优先级 


一、前言

前期入门学习的代码中,全部都是单线的程序,也就是从头到尾地运行

在我们平时使用手机电脑的应用程序时,它们几乎都是多线程地工作

例如idea,typora等等。本文就从现在开始,一步步尝试写多线程程序代码,一起来学习吧!


二、基本概念

进程

任何的软件存储在磁盘中,运行软件的时候,OS使用IO技术,将磁盘中的软件的文件加载到内存,程序在能运行。

这里的内存大小就是电脑内存条的大小,也就是平时所说的运行内存大小,常见的有4G,8G,16G,32G甚至更高。

 应用程序运行的时候进入到内存,程序在内存中占用的内存空间就叫进程

 线程

在内存和CPU之间,建立一条连接通路,CPU可以到内存中取出数据进行计算,这个连接的通路,就是线程

 一个进程(内存资源)可以开启多个线程,也就是多条通路。

  • 并发: 同一个时刻多个线程同时操作了同一个数据
  • 并行: 同一个时刻多个线程同时执行不同的程序

 拓展一个知识,CPU(中央处理器)现在我们都会看到多少核心多少线程,对操作系统而言,一个核心同一时刻只能运行一个进程/线程,所以多核多线程CPU可以极大提升效率

 


三、Java多线程实现

java.lang.Thread类

Java万物是对象,所以线程也是对象,Thread类是线程对象的描述类

实现线程程序可以分为几个步骤:

  1. 定义一个类来继承thread类
  2. 子类重写方法run
  3. 创建子类对象
  4. 调用子类对象的start()方法启动线程

 我们用一个简单的例子来演示一下,运行一下for语句

//定义一个类来继承thread类
//子类重写方法run
public class SubThread extends Thread {public void run(){for(int x = 0 ; x < 50 ;x++)System.out.println("run---"+x);}
}
public static void main(String[] args) {SubThread subThread = new SubThread();    //创建线程程序subThread.start();            //调用子类对象的方法start()启动线程//启动线程,JVM调用方法runfor(int x = 0 ; x < 50 ;x++)System.out.println("main---"+x);
}

我们运行一下,不难看到两个for此时是分开工作,且符合线程的随机性(是个渣男),喜欢哪个,就运行哪个,所以你会发现,每次运行输出的结果都会不一样,无规律性

获取线程名字及对象

 既然我们成功运行了程序,那就进一步了解线程的相关知识。

线程也是有名字的,默认为thread-0,thread-1,thread-2,以此类推

要查看线程的名字,我们可以用thread类的方法getName()返回线程的名字,返回值是String类型

因为继承的是父类thread,要用其方法,也得使用super

public class ThreadName extends Thread {public void run (){System.out.println("线程名字:: "+ super.getName());}
}

当我们想修改线程名时,就可以使用setName()方法

   public static void main(String[] args) {ThreadName threadName = new ThreadName();//threadName.setName("线程1");threadName.start();ThreadName threadName1 = new ThreadName();//threadName1.setName("线程2");threadName1.start();}

获取main进程名

前言说道,入门写过的代码,都是单线程,那这个单线程的main进程名该怎么获取,首先我们可以尝试一下让这个类继承一下thread类

当然,因为是静态static

 public static void main(String[] args){}

所以我们不能直接调用thread的getName()方法,这时我们可以使用另一个方法返回一个线程对象,然后用这个对象来调用getName()方法

Thread currentThread()

  • 静态调用,作用是返回当前的线程对象

  • "当前" , 指的是调用这个方法的线程

我们在上面的main中调用,就可以返回当前(main)的 对象

Thread thread =  Thread.currentThread();
System.out.println("name::"+thread.getName());

 运行结果显示,它的线程名就为:main

 同理,也可以用此方法获取其他继承thread类的子类的线程名,代替getName()


四、线程优先级 

 所有的线程优先级都是默认的,所以会产生刚开始我们设置两个线程进行for循环,输出结果无规律的现象。默认值为5,最低为1,最高为10

设置优先级 

这次使用到的方法如下: 

setPriority()

 创建好对象后,我们调用setPriority()方法即可。

 理论上 优先级高的线程,占用CPU时间相对较长一些

t1.setPriority(MAX_PRIORITY);    //优先级最高
t0.setPriority(MIN_PRIORITY);    //优先级最低

今天的Java多线程程序学习就到此为止了,喜欢的小伙伴记得点赞关注,一键三连,你们的支持就是我最大的动力,谢谢!

http://www.lryc.cn/news/140539.html

相关文章:

  • 8.5 【C语言】指向函数的指针
  • C++实现字符串的逆置
  • 论Spring或Spring Boot的花式扩展
  • 如何评估分类模型的好坏
  • ● 84.柱状图中最大的矩形
  • 未检查的转换: ‘java.lang.Object‘ 转换为 ‘java.util.List
  • 【C语言】使用C语言,实现九九乘法表(另附Python、Java、JavaScript实现方式)
  • [机缘参悟-102] :IT人 - 管理的本质?管理人与从事技术的本质区别?人性、冰山模型、需求层次模型
  • [论文阅读笔记26]Tracking Everything Everywhere All at Once
  • 【Java 动态数据统计图】前后端对接数据格式(Map返回数组格式数据)六(120)
  • ❤ 给自己的mac系统上安装java环境
  • Java-匿名类
  • Maven的超级POM
  • 软考高级系统架构设计师系列论文九十二:论新技术的引进
  • vue使用Bootstrap的详细方法
  • leetcode做题笔记103. 二叉树的锯齿形层序遍历
  • 如果将PC电脑变成web服务器:利用Nignx反向代理绕过运营商对80端口封锁
  • Eureka:服务注册-信息配置-自我保护机制
  • C++二叉树进阶
  • layui tree组件取消勾选
  • 【Android基础面试题】ViewPager与ViewPager2的区别
  • springCloudGateway网关配置
  • kali 2023.3新增工具
  • W25Q64 驱动--基于SPI2接口
  • 禁用无线键盘指定按键
  • 分数规划(二分)
  • Vue2向Vue3过度Vue3状态管理工具Pinia
  • STM32--SPI通信与W25Q64(1)
  • 版本控制工具Git常见用法
  • Multisim软件安装包分享(附安装教程)