Java语言学习总结 扩展篇 多线程的概念及使用

多线程

多线程就是同时进行多个任务,比如同时听歌同时打游戏。

并发与并行

并发:两个或多个事件在同一时间段内发生。即两个或多个事件在CPU中交替进行。
并行: 两个或多个事件在同一时间内统统是发生,即两个或多个事件在CPU中同时执行。

线程和进程

进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个进程;进程也是程序的一次执行过程,是系统运行程序的基本单位;系统运行一个程序即是一个进程从创建、运行到消亡的过程。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行, 一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序
简而言之: 一个程序运行后至少有一个进程, 一个进程中可以包含多个线程

程序运行时,加入到RAM内存中运行的即为进程。
当点击程序中一个具体的功能时,该功能事件就会到CPU中执行。执行路径就叫做线程。
分析图如下:
线程分析图
(图片来此B站网课黑马程序员)

线程调度

●分时调度
所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间。
●抢占式调度
优先让优先级高的线程使用CPU ,如果线程的优先级相同,那么会随机选择一个(线程随机性) , Java使用的为抢占式调度。

主线程

主线程: 执行主mian()方法的线程 。JVM执行main方法时,main方法会进入到栈内存中。JVM会找操作系统开辟一条main方法通向cpu的执行路径,cpu就可以通过这个路径来执行main方法,而这个路径有一个名字,叫main(主)线程。

创建多线程程序

Java使用java.lang.Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例。每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一 段顺序执行的代码。Java使用线程执行体来代表这段程序流。
Java中通过继承Thread类来创建并启动多线程的步骤如下:

  1. 定义Thread类的子类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体
  2. 创建Thread子类的实例,即创建了线程对象
  3. 调用线程对象的start()方法来启动该线程

创建新执行线程有两种方法。一种方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。

实例代码:
首先创建一个Thread类的子类:

//创建一个Thrad类的子类
public class MyThread extends Thread{
	//在Thread类的子类中重写run()方法,设置线程任务
	@Override
	public void run() {
		for(int i=0;i<20;i++) {
			System.out.println("run:" + i);
		}
	}
}

在调式类中调用Thread子类创建子类对象:

public class ThreadClass {

	/*
	 * 创建多线程程序的第一种方式:创建Thread类的子类
		java.lang.Thread类:是描述线程的类,我们想要实现多线程程序,就必须继承Thread类
		实现步骤:
			1.创建一个Thread类的子类
			2.在Thread类的子类中重写Thread类中的run方法,设置线程任务(开启线程要做什么?)
			3.创建Thread类的子类对象
			4.调用Thread类中的方法start方法,开启新的线程,执行run方法
				void start() 使该线程开始执行; Java虚拟机调用该线程的run方法。
				结果是两个线程并发地运行;当前线程(main线程)和另一个线程(创建的新线程,执行其run方法)。
				多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
		java程序属于抢占式调度,那个线程的优先级高,那个线程优先执行;同一个优先级,随机选择一个执行
	 */
	public static void main(String[] args) {
		//创建Thread类的子类对象
		MyThread mt = new MyThread();
		//调用Thread类中的start()方法,开启新县城,执行run方法
		mt.start();
		
		for(int i=0;i<20;i++) {
			System.out.println("main:" + i);
		}
	}

}

输出结果:
输出结果
可见两个方法同时执行for循环输出。每次输出结果不一样,具有随机性,一起抢夺cpu
的使用权。

多线程原理

分析过程如图:
分析
多线程任务在执行时会开辟不同的栈空间来执行事件。
分析如图:
分析图

获取线程名称

创建Thread子类:

public class GetThreadNameClass extends Thread{
	@Override
	public void run() {
		//获取线程名称
		//方法一
		String name = getName();
		System.out.println(name);
		
		//方法二
		//Thread t = Thread.currentThread();
		//System.out.println(t);
	}

}

创建测试类

public class GetThreadNameTest {

	public static void main(String[] args) {
		//创建thread类的子类对象
		GetThreadNameClass mt = new GetThreadNameClass();
		mt.start();
		
		new GetThreadNameClass().start();
		new GetThreadNameClass().start();
		new GetThreadNameClass().start();
		
		//获取主线程的名字
		System.out.println(Thread.currentThread().getName());	
	}
}

输出结果:
输出结果

设置线程名称

设置线程的名称:

  1. 使用Thread类中的方法setName(名字)
    void setName(String name) 改变线程名称,使之与参数name 相同。
    2.创建一个带参数的构造方法,参数传递线程的名称;调用父类的带参构造方法,把线程名称传递给父类,让父类( Thread)给子线程起一个名字
    Thread(String name) 分配新的Thread 对象。

————————————————————————————————————
(本问部分图片摘自b站中的黑马程序员课程)

发布了72 篇原创文章 · 获赞 3 · 访问量 6183

猜你喜欢

转载自blog.csdn.net/Ace_bb/article/details/104168392
今日推荐