线程(Thread)知识点总结

多线程

并行与并发
  • 并发:指的是两个或者多个事件(任务)在同一时间段内发生的
  • 并行:指的是两个或者多个事件(任务)在同一时时刻发生(同时发生)的

在这里插入图片描述

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

简而言之,一个程序运行后至少有一个进程,一个进程中可以包含多个线程.

备注:单核处理器的计算机肯定不能并行的处理多个任务的,只能是多个任务在单个cpu上并发的执行。同理,线程也是一样的,从宏观角度H理解线程是一种并行运行的, 但是从微观上分析并行运行不可能,即需要一个一 个线程的去执行,当系统只有个cpu的时候,线程会以某种顺序执行多个线程,我们]把这种情况称之为线程调度。

线程调度:

  • 分时调度:所有的线程轮流使用CPU的使用权,平均分配给每个线程占用CPU的时间
  • 抢占式调度:优先让优先级高的线程使用CPU,如果有线程的优先级相同,那么会随机一个线程执行,Java使用的就是抢占式调度方式来运行线程程序.
    • 设置线程的优先级
创建线程类

java使用java.langThread类代表线程,所有的线程对象都必须是Thread类或者Thread类的子类的示例.每个线程的作用是完成一定的任务.实际上上就是执行一段程序流,java使用线程的执行体来代表这段程序流.

java中通过继承Thread

  1. 创建一个Thread类的子类
  2. 在Thread类的子类当中重写Thread类的run方法,设置线程任务(开启线程需要你做什么事情? )
  3. 创建Thread类的子类对象
  4. 调用Thread类中的方法start方法,开启新线程,执行run方法
    void start()使该线程开始执行; Java 虚拟机调用该线程的run方法。
    结果是两个线程并发地运行;当前线程(从调用返回给start 方法)和另一个线程(执行其run方法)。
    多次启动一个线程是非法的。特别是当线程已经结束执行后,不能再重新启动。
    实例代码:
public class Student {
   
	private String name;
	
	//定义一个方法run
	public void run() {
   
		//定义一个循环:循环20次,分别打印循环次数
		for(int i = 0;i < 20;i++) {
   
			System.out.println(i+this.getName());
		}
	}

	public Student() {
   
		super();
	}

	public Student(String name) {
   
		super();
		this.name = name;
	}

	public String getName() {
   
		return name;
	}

	public void setName(String name) {
   
		this.name = name;
	}

	@Override
	public int hashCode() {
   
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
   
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (name == null) {
   
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
   
		return "Student [name=" + name + "]";
	}
	
}
/*
 * 主线程:执行主(main)方法的线程
 * 
 * 单线程的程序,java程序中只有一个线程,执行从main方法开始,程序是从上往下依次执行
 * 
 * JVM执行main方法,main方法会进入到栈内存当中
 * JVM会调用操作系统开辟一条main方法通向cpu的路径
 * cpu就可以通过这个路径来执行main方法
  *  而这个路径有一个名字,叫主线程(main线程)  Thread(main)
 */
public class ThreadDemo01 {
   
		public static void main(String[] args) {
   
			new Student("小孙").run();
			//System.out.println(0/0); //Exception in thread "main" ArithmeticException
			new Student("小王").run();
		}
	
}
多线程的原理

我们先画个多线程执行时序图让你感受下多线程的执行流程。
在这里插入图片描述
程序启动运行main时候,java虚拟机启动一个进程,主线程main在main调用的时候被创建。随着调用oneThread对象的start方法,另外一个新的线程也启动了,这样,整个应用就在多线程环境下运行着。

通过上面一张图可以发现多线程在内存当中的执行流程。

多个线程执行时,在栈内存当中,其实每一个线程都有一片属于自己的栈内存空间,进行方法的压栈和弹栈。

当执行线程的任务结束了,线程自动在栈内存当中释放了。当所有的执行线程都结束了,那么进程也就结束了。

Thread类

API帮助文档中定义了有关线程的一些方法,具体如下:
构造方法

  • public Thread():分配一个新的线程对象
  • public Thread(String name):分配一个指定名字的新的线程对象
  • public Thread(Runnable target):分配一个带有指定目标新的线程对象
  • public Thread(Runnable target,String name):分配一个带有指定目标的新的线程对象并且带有指定名字的。

常用的方法:

  • public String getName():获取当前线程的名称
  • public void sta
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值