首页 > 编程语言 >【Java】多线程 Start() 与 run() (简洁实操)

【Java】多线程 Start() 与 run() (简洁实操)

时间:2024-10-18 20:21:42浏览次数:8  
标签:调用 run Thread start Start 线程 多线程 public

Java系列文章目录

补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史


文章目录

一、前言

  • 主要是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 并行、并发与串行的区别

  1. 串行 (Serial):
    ○ 定义:任务一个接一个地顺序执行。
    ○ 特点:只有一个任务在运行,必须等待前一个任务完成后才能开始下一个任务。
    ○ 例子:做饭时,先切菜,等切完菜再煮汤。
  2. 并发 (Concurrency):
    ○ 定义:多个任务在同一时间段内交替进行,可能在不同上下文间切换。
    ○ 特点:任务可以同时启动,但不一定同时完成。系统会在多个任务之间切换。
    ○ 例子:在做饭的过程中,边切菜边煮汤,虽然每项具体工作都在某个时刻只做一件,但两者之间切换。
  3. 并行 (Parallelism):
    ○ 定义:多个任务在同一时间真正同时执行。
    ○ 特点:需要有多个处理单元(如多核CPU)。任务完全独立,实际同时运行。
    ○ 例子:在厨房里,两个厨师同时切菜和煮汤,真正实现了同时的物理执行。

五、总结:

  • 使用 start():启动线程,让其并发执行
  • 使用 run():直接执行任务,不会创建新线程,适用于顺序执行任务。

⭐️ 通过 start() 方法才能启动新线程

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

在这里插入图片描述

标签:调用,run,Thread,start,Start,线程,多线程,public
From: https://blog.csdn.net/m0_66070037/article/details/143061262

相关文章

  • java多线程
    学习java多线程packagecom.haole.testdemo1;classRunnableDemo3implementsRunnable{privateStringname;privateThreadx;RunnableDemo3(Stringa){name=a;}@Overridepublicvoidrun(){for(inti=0;i<4;......
  • 多线程(五):死锁&内存可见性问题
    目录1.synchronized---监视器锁monitorlock2.死锁2.1死锁---情况12.1.1可重入2.1.2 如何实现一个可重入锁[面试题]2.2死锁---情况22.2.1BLOCKED2.2.2手写死锁代码[经典面试题]2.3 死锁---情况33.避免死锁的出现3.1构成死锁的四个必要条件★......
  • 【Linux线程】Linux多线程编程:深入理解线程互斥与同步机制
    ......
  • Android Framework AMS(08)service组件分析-2(startService和StopService关键流程分析)
    该系列文章总纲链接:专题总纲目录AndroidFramework总纲本章关键点总结&说明:说明:上一章节主要解读应用层service组件启动的2种方式startService和bindService,以及从APP层到AMS调用之间的打通。本章节主要关注service组件启动方式的一种:startService启动方式,分析关键API......
  • Java多线程编程:深入理解与实践
    java笔记,点击下载在现代软件开发中,多线程编程已成为提高程序性能和响应能力的关键技术之一。Java作为一门高级编程语言,提供了丰富的多线程支持,使得开发者能够轻松地编写并发程序。本文将深入探讨Java多线程的基本概念、实现方式以及最佳实践。多线程的基本概念多线程是指......
  • 一个月学会Java 第20天 多线程
    Day20多线程线程,很重要的概念,因为我们的CPU假如是intel或者amd的都是说一核二线程,假如你的电脑是8核的cpu那基本上就是16线程,如果你的mac的M芯片自然是几核就是几线程。想要查看自己的电脑是几个线程的我们有几种方法,一种直接使用Java运行一串代码,其次我们可以看任务管......
  • 【Docker】Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is
    问题描述CannotconnecttotheDockerdaemonatunix:///var/run/docker.sock.Isthedockerdaemonrunning?原因分析尝试运行Docker命令时,系统无法与Docker守护程序(daemon)通信。Docker服务未运行。解决方案确保Docker服务已经启动。通过在终端中运行s......
  • 【Linux】<互斥量>解决<抢票问题>——【多线程竞争问题】
    前言大家好吖,欢迎来到YY滴Linux系列,热烈欢迎!本章主要内容面向接触过C++的老铁主要内容含:欢迎订阅YY滴C++专栏!更多干货持续更新!以下是传送门!YY的《C++》专栏YY的《C++11》专栏YY的《Linux》专栏YY的《数据结构》专栏YY的《C语言基础》专栏YY的《初学者易错点》......
  • 本地运行vercel模板项目vercel/nextjs-postgres-auth-starter
    官方指南链接:https://vercel.com/templates/next.js/prisma-postgres-auth-starter创建项目create-next-appnpxcreate-next-appnextjs-typescript-starter--example"https://github.com/vercel/nextjs-postgres-auth-starter"进入nextjs-typescript-startercdnextj......
  • 【Linux】解锁线程基本概念和线程控制,步入多线程学习的大门
    目录1、线程初识1.1线程的概念1.2.关于线程和进程的进一步理解1.3.线程的设计理念1.4.进程vs线程(图解)1.5地址空间的第四谈2.线程的控制:2.1.关于线程控制的前置知识2.2创建线程的系统调用:这个几号手册具体代表的什么含义?2.3.线程终止我们怎么没有像进程一样获取线程......