多线程重要吗?
java中的多线程/高并发机制,是一个IT从业者(有关java)未来收入上限
但这部分也是java中最难,涉及到的知识点最多的地方,它融合了数据结构与操作系统,甚至计算机组成原理等方面的知识。
以下仅是关于多线程的入门基础,会持续更新
文章目录
- 线程与进程
- 线程的相关概念
- 创建线程的两种方式
- 对一个线程案例的详细分析
- 关于启动线程的start()方法解读
1、进程与线程
进程:正在运行的程序
是程序一次执行过程,或是正在运行的一个程序。是动态过程,有它自身的产生,存在和消亡的过程。
线程:
-
线程是由进程创建的,是进程的一个实体
-
一个进程可以有多个线程
二、线程的相关概念
单线程: 同一时刻,只允许执行一个线程
多线程: 同一时刻,可以执行多个线程
并发: 同一时刻,多个任务交替进行,造成一种“貌似同时”的错觉,简单来说,单核cup实现的任务就是并发
并行: 同一时刻,多个任务同时执行,多核cpu可以实现并行。 并行里也可能出现并发
三、创建线程的两种方式
01 .继承Thread类,重写run方法 Thread类也是继承了Runable类
02. 实现Runnable接口,重写run方法 追根溯源 都是Runnable里面的run()
(下面就是一个子线程的创建)
方式01
class Cat extends Thread{
int times = 0;
@Override
public void run() {
while (true){
//让线程每隔一秒,在控制台输出一次
System.out.println("hello 线程"+(++times)+"线程名"+Thread.currentThread().getName());
try {
//让线程休眠一秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(times == 100)
{
break;
}
}}
方式02
package com.xiancheng;
/**
* written by 刘瑞臻
* time:2022/11/26 17:02
*/
//通过实现接口Runnable 来开发线程
public class Tread02 {
public static void main(String[] args) {
CAT cat = new CAT();
// 在这里没有start方法
// 需要创建一个thread对象 将cat对象传进去
// 这里使用了代理模式
Thread thread = new Thread(cat);
thread.start();
}
}
class CAT implements Runnable{
int times = 0;
@Override
public void run() {
while (true)
{
System.out.println("喵喵喵~~"+(++times)+" 线程名称:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if (times == 80)
break;
}
}
}
四、对一个线程的详细分析
(主要是对如下两个线程的分析)
package com.xiancheng;
/**
* written by 刘瑞臻
* time:2022/11/26 14:39
*/
public class thread {
public static void main(String[] args) {
Cat cat = new Cat();
cat.start();
for (int i = 0; i < 80; i++) {
System.out.println("主线程"+i+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//当一个类继承线程是 该类就可以当成线程使用
class Cat extends Thread{
int times = 0;
@Override
public void run() {
while (true){
//让线程每隔一秒,在控制台输出一次
System.out.println("hello 线程"+(++times)+"线程名"+Thread.currentThread().getName());
try {
//让线程休眠一秒
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(times == 100)
{
break;
}
}}
}
当执行main方法时,相当于创建了一个进程 相应的main线程也会相应的启动
如果此时再加入一个线程 两个线程交替执行
代码运行结果: 可以看到两个线程的关系 并不是我们理解的那样同时执行,是交替着执行的
可以在这里输入 Jconsole连接监视器 查看进程具体情况
在这里我们又发现了一个有趣的现象:
在这里我们可以观察到,当主线程结束的时候 并不意味着整个线程的结束 更不是进程的结束
在主线程中可以开子线程 在子线程中也可以继续开子线程
五、关于启动线程的start()方法解读
只有用start()方法才能启动子线程,如果直接调run()方法,其实还是相当于在主线程执行方法,执行完之后才向下执行,在此期间并不会真正的开启子线程
Start方法详细解读:
这个方法主要执行的是star0方法 真正是实现多线程的效果其实是start0方法
而这个方法底层是native类型的方法 是由JVM虚拟机实现的