每天学习多一点。烦恼少一点。
文章目录
前言
本篇内容我们认识一下java中一个重要的知识点:多线程
本次目标:
- 认识多线程
- 掌握多线程的程序编写
- 重点掌握1.3 进程和线程的区别
一、多线程是什么?
认识线程(Thread)
1.1 线程的概念
- 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。
- 每个线程都是一个“执行流”,可以单独的在cpu上进行调度
- 同一个进程中的这些线程,共用一份系统资源(内存+文件)
我们通过举一个现实中的例子来更清楚的理解一下!!!
我们设想如下场景:小明开了一家公司,然后到了年底来到银行进行财务转账,福利发放,给员工缴纳社保。
但是呢,一个人做这些事情又麻烦而且还耗时长。所以他叫来了自己公司的两个员工A,B。
这三个人分别负责解决一件事情,就有了三个执行流共同完成任务。但本质上他们三个都是在办理一家公司所需要的业务。
而这三个员工就称为线程,小明也一般被称为主线程。
1.2 为什么要有线程
1.“并发编程”称为“刚需”
- 单核 CPU 的发展遇到了瓶颈. 要想提高算力, 就需要多核 CPU. 而并发编程能更充分利用多核 CPU资源.
- 有些任务场景需要 “等待 IO”, 为了让等待 IO 的时间能够去做一些其他的工作, 也需要用到并发编程
2.多进程虽然也能实现并发编程, 但是线程比进程更轻量
- 创建线程比创建进程更快.
- 销毁线程比销毁进程更快.
- 调度线程比调度进程更快.
3.线程池(在此处就不进行讲解了。关于线程池的内容我们后边再介绍,或者感兴趣的小伙伴可以自行研究一下!!!)
1.3 进程和线程的区别(重点内容)
- 进程是包含线程的. 每个进程至少有一个线程存在,即主线程
- 线程比进程更轻量,创建更快,销毁也更快。进程和进程之间不共享内存空间而同一个进程的线程之间共享同一个内存空间.
- 进程是系统分配资源的最小单位,线程是系统调度的最小单位。
1.4 多线程
我们就把小明公司解决问题的情况称为多线程,将一个大任务分解成不同小任务,交给不同执行流就分别执行。这样的操作就被称为多线程!!!
多线程能够在一定程度上提高效率,那是不是在一个进程中,线程的数目越多越好呢?
答案是:错!!!!
对于多线程来说,线程的数目不是越多越好,cpu核心数是有限的,当线程数目达到一定程度的时候,cpu核心数就已经被吃满了,此时在增加线程,也没办法再提高效率,反而因为线程太多,线程的调度开销太大,从而影响了效率!
二、编写多线程程序
方法一:继承 Thread 类
我们通过继承Thread类
//在标准库中提供了一个Thread类,使用的时候继承这个类
class MyThread extends Thread {
@Override
//重写run方法
public void run() {
//这里就是这个线程要执行的工作
System.out.println("Thread");
}
}
// 演示多线程的基本创建方式.
public class Demo1 {
public static void main(String[] args) {
//创建Mythread类的实例
MyThread t =new MyThread();
//通过调用start方法启动线程
t.start();
}
}
这里创建了一个MyThread实例,但并不会在系统中真的创建一个线程,在调用start方法的时候,才是真正的创建出一个线程。新的线程会执行run里面的逻辑,直到run里的代码执行完之后,新的线程就运行结束了。
当我们运行这个程序的时候,就相当于启动了一个进程
一个进程里至少有一个线程,而这里默认的线程,正是main方法所在的线程
方法二:实现 Runnable 接口
class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("这里是线程运行的代码");
}
}
public class Demo2 {
public static void main(String[] args) {
//这里把线程需要干的活和线程本身分开了,使用Runnable来专门表示“线程要完成的工作”
Thread t = new Thread(new MyRunnable());
t.start(); // 线程开始运行
}
}
使用Runnable接口,就是为了以后如果需要改动,只需要将Runnable传给其他实体即可(解耦合)
方法三:使用匿名内部类创建
- 匿名内部类创建Thread子类对象
public static void main(String[] args) {
Thread t1 = new Thread(){
@Override
public void run() {
System.out.println("使用匿名类创建 Runnable 子类对象");
}
};
t1.start();
}
- 匿名内部类创建Runnable子类对象
public static void main(String[] args) {
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("使用匿名类创建 Runnable 子类对象");
}
});
t2.start();
}
总结
我们通过简单的介绍讲解了线程的含义和多线程的概念,希望能够通过这篇文章能够更好的理解和掌握。其中我们也通过三种方法编写了简单了多线程程序,希望你我能够更好的理解和掌握多线程的创建。
如有错误,还希望各位佬多多指正哦!!!!
对别人的酸是我们努力最好的鞭策。