Java系列文章目录
补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史
文章目录
- Java系列文章目录
- 一、前言
- 二、学习内容:
- 三、问题描述
- start() 方法
- run() 方法
- 四、解决方案:
- 4.1 重复调用 .run()
- 4.2 重复调用 start()
- 4.3 正常调用 start() 不会报出异常
- 4.4 并行、并发与串行的区别
- 五、总结:
一、前言
- 主要是start()与run()的区别
- 并发、并行、串行的区别
二、学习内容:
- 学习多线程抢占 CPU 资源。
- start() 与 run() 函数的区别。
三、问题描述
start() 方法
- 功能:用于启动一个新线程。
- 线程状态:线程从 “New” 状态转变为 “Runnable” 状态,已准备,未执行。
- 并发执行:调用线程和新线程可以并发执行。
- 多次调用:一个线程只能调用一次 start();如果尝试多次调用,会抛出
java.lang.IllegalStateException
异常。
总结:
- ⭐️start() 方法启动线程。
- ⭐️必须避免重复启动已结束的线程。
run() 方法
- 功能:定义线程的具体执行任务。
- 线程状态:当前线程
- 顺序执行:使用.run() 方法并不会启动新线程,只在当前线程中执行。
- 多次调用:可以多次调用 run() 方法,只在当前线程中执行。
总结:
- ⭐️run() 方法是本线程的任务内容,不会创建新线程。
四、解决方案:
4.1 重复调用 .run()
无异常,因为在当前线程里面
class MyThread extends Thread{
@Override
public void run(){
System.out.println("ThisThread" + Thread.currentThread().getName());
}
}
public class test{
public static void main(String[] args){
Thread MyThread1 = new MyThread();
for(int i = 0; i < 3; i++){
MyThread1.run();//此处
}
}
}
4.2 重复调用 start()
Java 设计线程时,明确规定一个线程的生命周期管理。通过确保每个线程只能被启动一次
⭐️报出 llegalComponentStateException
异常
class MyThread extends Thread{
@Override
public void run(){
System.out.println("ThisThread" + Thread.currentThread().getName());
}
}
public class test{
public static void main(String[] args){
Thread MyThread2 = new MyThread();//一个线程
for(int i = 0; i < 3; i++){
MyThread.start();//多次
}
}
}
4.3 正常调用 start() 不会报出异常
每个线程启动一次
class MyThread extends Thread{
@Override
public void run(){
System.out.println("ThisThread" + Thread.currentThread().getName());
}
}
public class test{
public static void main(String[] args){
for(int i = 0; i < 3; i++){
Thread MyThread3 = new MyThread();//一个线程
MyThread.start();//每次启动
}
}
}
4.4 并行、并发与串行的区别
- 串行 (Serial):
○ 定义:任务一个接一个地顺序执行。
○ 特点:只有一个任务在运行,必须等待前一个任务完成后才能开始下一个任务。
○ 例子:做饭时,先切菜,等切完菜再煮汤。 - 并发 (Concurrency):
○ 定义:多个任务在同一时间段内交替进行,可能在不同上下文间切换。
○ 特点:任务可以同时启动,但不一定同时完成。系统会在多个任务之间切换。
○ 例子:在做饭的过程中,边切菜边煮汤,虽然每项具体工作都在某个时刻只做一件,但两者之间切换。 - 并行 (Parallelism):
○ 定义:多个任务在同一时间真正同时执行。
○ 特点:需要有多个处理单元(如多核CPU)。任务完全独立,实际同时运行。
○ 例子:在厨房里,两个厨师同时切菜和煮汤,真正实现了同时的物理执行。
五、总结:
- 使用 start():启动线程,让其并发执行。
- 使用 run():直接执行任务,不会创建新线程,适用于顺序执行任务。
⭐️ 通过 start() 方法才能启动新线程
(后续有遇到问题再添加)
声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。