JAVA多线程入门
在学习java多线程编程的时候可以结合《操作系统》这门课一起学,这样更能掌握。
进程与线程概念
在学习多线程,一定离不开进程和线程。而进程与线程之间的关系可以说是包含的关系。线程是进程的一部分。进程其实就是应用程序在内存中分配的空间,即正在运行的程序,而线程就是可以执行应用程序中的一个子任务。
举个例子:就是比如在玩游戏(LOL)的时候,当我们打开LOL游戏的时候,其实就是在启动了一个进程,打开任务管理器就可以看见有一个进程了,而在玩游戏的时候,我们肯定是要爽一波的,会想去听下游戏声音,而这个音效就相当于一个线程了。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uldhxdeu-1591378967742)
(我说我没在玩,你信吗,好吧,玩了一把)
进程与线程的区别
进程是一个独立的运行环境,而线程就是其中执行的一个子任务。他们的本质区别就在于
-
是否单独占用内存地址空间和其他系统资源
1.1、进程他单独占用一大块的内存地址空间,进程间是隔离开来的,数据也是分开占用,互不干扰,使得两进程之间的数据交换变得困难;而线程是共享属于同一个进程的资源和空间的,这样使得数据交换就方便多了。
1.2、一个进程他就算出现了问题,他也不会影响其他的进程的执行(就比如:你的WeChat突然就卡死了,但lol还是可以继续玩),而线程,一个线程的崩溃可能就会造成整个程序的崩溃或者其他进程的崩溃。(因为数据是共享的,使得可以两线程共用一个数据)
1.3、进程的创建和销毁的开销大,而线程的开销小。(保存寄存器、栈信息、资源的分配回收以及页调度的考虑)
-
进程是操作系统进行资源分配的基本单位,而线程是操作系统进程调度的基本单位。
JAVA多线程入门知识
一、创建线程方法
在JAVA中,为我们提供了Thread类和Runnable接口(最为熟悉的)来让我们实现自己的“线程”类。
- 继承Thread类,重写run方法
- 实现Runnable接口的run方法
其实在java中,对于创建线程有很多人有疑问,到底是有多少种创建线程的方法? 其实说只有两种也是正确的,说是有3种也是正确的,答案很多,但其实本质上来讲就只有一种创建线程的方法。创建线程的方式有很多,例如:利用线程池来创建线程、利用Callable和Future来创建线程、定时器Timer等。(这里就不多深究了)
1、通过继承Thread类创建线程
public class ThreadDemo {
public static class MyThread extends Thread {
@Override
public void run() {
System.out.println("Thread类创建线程");
}
}
public static void main(String[] args) {
Thread myThread = new MyThread() {
myThread.start();
}
}
}
2、通过实现Runnable接口
public class ThreadDemo {
public static void main(String[] args) {
//使用JDK1.8的新特性Lambda表达式(也可以用匿名类或者直接实现)
new Thread(()-> {
System.out.println("实现Runnable接口创建线程");
}).start();
}
}
二、Thread类与Runnable接口的比较
其实在分析的时候,可以结合抽象类和接口的区别来进行比较,这样就更容易掌握。
在创建线程中有继承Thread类和实现Runnable接口两种,而这两种的优劣:
-
在java中是"单继承,多实现",使得实现Runnable接口显得更灵活点。
-
实现Runnable接口,能够降低线程对象和线程任务的耦合度。
-
继承Thread类的话,就直接将线程对象和任务捆绑在一起,使得之间的耦合度高。
结论: 在考虑线程的创建的时候,优先考虑实现Runnable接口。
三、Tread类中常用方法
多于Thread,我们知道了如何创建,但也要知道其中有哪些方法,具体的可以去看java api的,这里就简单的介绍一些常用的方法。
- start(): 开始执行线程(但未开始执行,只是预备状态)
- sleep(): 使得当前线程休眠(静态方法)
- yield(): 让当前线程自愿让出处理器(这里是自愿的,所以可能遭拒绝的)
- currentThread(): 返回当前正在执行的线程的引用 (静态方法)
- join(): 使当前线程等待另一个线程执行完后再继续执行。
本文总结:本文就只是简单的讲下什么是线程和继承、线程的创建以及线程类中的方法。
对于多线程的学习:这里我提一下自己的想法:
我觉得下一步可以先去了解下:
- 线程有几种状态?(再找一下线程的状态图啃其中的知识点,这里就放下一个线程状态转换图)
第二个图是我自己画的,不太好看,但由于第一个图密密麻麻的,所有我才放下我的图,这里只是为了让大家看的更简洁清晰点而已,但还是第一个图的知识全。(可以多看看其中的装换条件,然后去网上查查)