目录
一、前言
二、基本概念
进程
线程
三、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类是线程对象的描述类
实现线程程序可以分为几个步骤:
- 定义一个类来继承thread类
- 子类重写方法run
- 创建子类对象
- 调用子类对象的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多线程程序学习就到此为止了,喜欢的小伙伴记得点赞关注,一键三连,你们的支持就是我最大的动力,谢谢!