JAVA多线程学习笔记(一): 多线程的基础概念以及Thread类常用方法介绍

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用 背景模糊 是一个很实用的功能,它可以帮助游戏在视觉上有更好的专注力和表现力。 实现模糊的种类和方式有很多种,大家自行选择适合自己的就可以了。 下面一起来看下本文实现背景模糊的效果和使用方式吧! 阅读详情

关于JAVA多线程的学习笔记,这一篇主要整理的是一些多线程中常见的概念,线程状态以及Thread类的常用方法

1.多线程相关的重要概念

1.1 线程、进程

1.1.1 基本定义

  • 进程:计算机上所有可运行的软件,通常也包括操作系统,被组织成若干顺序进程,简称进程。进程保存了程序每个时刻的运行状态,为进程的切换提供可能。一个进程对应一个程序,每个进程对应一定的内存地址空间
  • 线程:轻量级进程,进程里的“进程”,一个线程负责一个子任务,一个进程中可以有多个线程。

1.1.2 区别

进程线程
计算机资源分配的基本单位线程是CPU调度的基本单位
独立的地址空间线程共享进程的地址空间
开销大开销小(轻量级)

1.2 多线程、并发、并行

1.2.1 多线程

举例:比如用浏览器,同时进行浏览网页、播放视频、下载资源、听音乐等操作,多个线程同时执行不同的子任务

1.2.2 并发(concurrency)

同时处理多个事务的能力。并发是把CPU运行时间划分成若干个时间段,每个时间段再分配给各个线程执行,当一个线程在运行时,其它线程处于挂起状。从宏观角度是同时进行的,但从微观角度并不是同时进行。

1.2.3 并行(parallel)

多个cpu实例或者多台机器同时处理一段逻辑(并行是同一时刻当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,是真正意义上的不同线程在同一时刻同时执行)

1.2.4 区别

  • 并发就像一个人(CPU)喂两个小孩(程序)吃饭,表面上是两个小孩在吃饭,实际是一个人在喂。
  • 并行就是两个人喂两个小孩子吃饭。

1.3 线程安全

1.3.1 概念

线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。

2. 线程状态

2.1 状态

查看源码,JAVA线程一共有6种状态

状态含义
NEW尚未启动的线程处于这种状态
RUNNABLE正在JAVA虚拟机中执行的线程处于这种状态
BLOCKED受阻塞并等待某个监视器锁的线程处于这种状态
WAITING无限期地等待另一个线程来执行某一特定操作的线程处于这个状态
TIMED_WAITING等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态
TERMINATED已退出的线程处于这种状态

2.1.1 NEW、RUNNABLE、TERMINATED

这三个状态比较好理解,就是从创建到运行到最后完成的生命流程

2.1.2 WAITING、TIMED_WAITING、BLOCKED

这三个状态,相对比较容易混乱,这里进行一下区分:

  • BLOCKED:是出现在某一个线程在等待锁的时候。其他的线程占有了锁,而当前的线程等待其他线程释放锁。
  • WAITING:等待,这里看起来跟上一个blocked被堵塞没有什么不同,查看源码,我们可以看到这个状态对应的三种情况:发现都是一个等待被其他线程唤醒的情况。BLOCKED是等待其他线程释放进程,而WAITING是等待其他线程用notify()等方式唤醒线程。
        /**
        * <ul>
        *   <li>{@link Object#wait() Object.wait} with no timeout</li>
        *   <li>{@link #join() Thread.join} with no timeout</li>
        *   <li>{@link LockSupport#park() LockSupport.park}</li>
        * </ul>
        */
  • TIMEWAITIG:直接翻译,就是时间等待的意思,我们查看它的源码,可以发现就像它的字面翻译一样,它就是处于一个等待时间执行完的状态
        /**
        * <ul>
        *   <li>{@link #sleep Thread.sleep}</li>
        *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
        *   <li>{@link #join(long) Thread.join} with timeout</li>
        *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
        *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
        * </ul>
        */

2.2 线程状态的转换

这里用一副图介绍一下:
这里写图片描述
再举个例子解释一下:

  • 比如现在有三个线程,同时到了到了同步块之前,其中两个进程调用了wait(),则一个线程保持了RUNABLE的状态,但另外两个线程进入了WAITING的状态,第一个线程完成了同步块的执行,并调用了notifyall()的函数,此时另外两个线程被唤醒,其中一个线程进入同步块,状态位RUNNABLE状态,另一个进入BLOCKED状态

3.Thread类介绍

3.1 实现多线程的两种方法

方法一:继承Thread类,并实现了run方法

    public class MyThread extends Thread {
	    @Override
	    public void run() {
		    super.run();
	    }
    }

方法二:实现Runable接口,实现run方法

    public class MyThread1 implements Runnable{
	    @Override
	    public void run() {
	    }
    }

举例:

    // MyThread 继承了 Thread类
    MyThread myThread = new MyThread();
	myThread.start();
		
	// MyThread 实现了 Runnable接口
	Runnable myThread1 = new MyThread1();
	Thread thread = new Thread(myThread1);
	thread.start();

这里就有一个问题,为什么两种方法调用的时候不一样,我们这里查看 Runnable 的源码

    // Runnable.class
    @FunctionalInterface
    public interface Runnable {
        public abstract void run();
    }

只有一个方法,且为抽象函数,因此实现该接口,实际上只是实现了一个方法的普通类,并非新的线程。我们再看 Thread 类:其本身就实现了Runnable的接口,查看它的源码,发现有几个native方法,(关于native,https://blog.youkuaiyun.com/Applying/article/details/81572167,我得上一篇博客里面有提及,可能能帮助您理解一下)也有部分是Java实现的方法。这里查看Thread的start方法

    // Thread.class
    private ThreadGroup group;
    public synchronized void start() {
        if (threadStatus != 0)
            throw new IllegalThreadStateException();
        group.add(this);
        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
            }
        }
    }

它通过将向ThreadGroup中加入一个新的进程,来创建一个新的进程。
这里就要注意一下,Thread也有run方法,但

    // Thread.class
    private Runnable target;
    @Override
    public void run() {
        if (target != null) {
            target.run();
        }
    }

这里注意一点,在一些面试题里也会问到:在Thread中直接调用run函数,是不能启动新的线程的。具体的原因,上面也已经解释过了

两种方法的对比:

使用继承Thread类的方式来开发多线程应用程序在设计上有局限性的,因为JAVA的单根继承,所以推荐使用实现Runnable接口的方式进行

3.2 Thread类常用方法

3.2.1 start()

开启一个新的线程,并将线程加入当前的线程组中

 public synchronized void start() {
        /**
         * This method is not invoked for the main method thread or "system"
         * group threads created/set up by the VM. Any new functionality added
         * to this method in the future may have to also be added to the VM.
         *
         * A zero status value corresponds to state "NEW".
         */
        if (threadStatus != 0)
            throw new IllegalThreadStateException();

        /* Notify the group that this thread is about to be started
         * so that it can be added to the group's list of threads
         * and the group's unstarted count can be decremented. */
        group.add(this);

        boolean started = false;
        try {
            start0();
            started = true;
        } finally {
            try {
                if (!started) {
                    group.threadStartFailed(this);
                }
            } catch (Throwable ignore) {
                /* do nothing. If start0 threw a Throwable then
                  it will be passed up the call stack */
            }
        }
    }

这里要注意一点,多个顺序执行的start()方法,顺序不代表线程启动的顺序。如下面的例子,执行的结果,并不会是“0 1 2 3 4 5 6 7 8 9”,某次执行的结果是:“1 4 2 6 0 5 3 9 7 8”

    public class MyThread extends Thread {
	    private int i;
	
	    @Override
	    public void run() {
		    super.run();
		    System.out.println(i);
    	}
	
	    public MyThread(int i) {
		    super();
		    this.i = i;
	    }
    }

    public class AA {
        public static void main(String[] args) {
    		for (int i = 0; i < 10; i++) {
	    		MyThread myThread = new MyThread(i);
		    	myThread.start();
		    }
	    }
    }

3.2.2 currentThread()

返回当前的线程,获取当前线程的实例,并进行各种操作,例如定义线程名,获取线程名等。

3.2.3 sleep()

在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行),执行完的线程进入TIMEWAITING的状态,等待时间走完再次被唤醒

3.2.4 getId()

获得线程的唯一标识

3.2.5 停止线程

Java有三种方法终止正在运行的线程:

  • 使用退出标志,使线程正常退出,即run方法完成后线程终止
  • stop(),这是一种已经被弃用作废的方法,不推荐。这种方法是暴力停止的方式,可能使一些请理性的工作得不到完成
  • 使用interrupt()中断线程

3.2.6 interrupt()

通过查看源码,我们可以发现调用该方法仅仅是在当前线程中打了一个停止的标志,并不是真的停止线程。而且还有两个配套的方法

  • this.interrupted():测试当前线程是否已经是中断状态,执行后具有将状态标志置为false的功能
  • this.isInterrupted():测试线程是否已经是中断状态,但不清除状态标记
  • 意味着,一个被标记的线程,连续两次执行interrupted(),第二次执行的时候,会返回false,因为第一次执行的时候,标志已经被清除。具体原因,我们可以看下面的源码,两个函数的实现,差别只有在是否重置停止标志
        public static boolean interrupted() {
            return currentThread().isInterrupted(true);
        }
    
        public boolean isInterrupted() {
            return isInterrupted(false);
        }
    
        /**
         * Tests if some Thread has been interrupted.  The interrupted state
         * is reset or not based on the value of ClearInterrupted that is
         * passed.
         */
        private native boolean isInterrupted(boolean ClearInterrupted);

3.2.7 如何正确停止线程

既然stop()不推荐,interrupt()只能打标记,那如何正确停止线程呢。常见的有两个方法

  • 异常法:利用interrupt()来对线程进行标记,并通过两个判断状态的函数进行判断,如果true,抛出异常,并在catch块中对异常信息进行相关的处理
  • 使用return停止线程:思路类似于异常法,利用interrupt()进行打标记,然后判断并返回,但更推荐上面的方法,因为使用异常流可以更好、更方便地控制程序的运行流程。

3.2.8 暂停线程

suspend()方法暂停线程,resume()方法恢复线程的执行。但这两个方法,已经被弃用了,因为在暂停的时候,并不会释放资源,容易造成死锁,我们可以看到源码中的说明:

    /**
    * @deprecated   This method has been deprecated, as it is
     *   inherently deadlock-prone.  If the target thread holds a lock on the
     *   monitor protecting a critical system resource when it is suspended, no
     *   thread can access this resource until the target thread is resumed. If
     *   the thread that would resume the target thread attempts to lock this
     *   monitor prior to calling <code>resume</code>, deadlock results.  Such
     *   deadlocks typically manifest themselves as "frozen" processes.
     *   For more information, see
     *   <a href="{@docRoot}/../technotes/guides/concurrency/threadPrimitiveDeprecation.html">Why
     *   are Thread.stop, Thread.suspend and Thread.resume Deprecated?</a>.
     */
    @Deprecated
    public final void suspend() {
        checkAccess();
        suspend0();
    }
    

那应该如何暂停跟启动呢?个人觉得方法有两个:

  • 使用sleep(),让线程暂停一段时间,等待时间过后自动唤醒,不过sleep也不会释放资源
  • 使用wait(),让方法暂停,并释放资源,等待其他事情完成后,其他线程利用notify()将其唤醒,结束暂停状态

3.2.9 yield()

作用为放弃当前的CPU资源,将它让给其他的任务去占用CPU执行时间。但放弃的时间不确定,有可能刚刚放弃,就获取CPU时间片

3.2.10 线程的优先级

setPriority()方法可以设置优先级。线程的优先级,一共分为1~10这10个等级,不在范围内的,会抛出异常。而且有3个常量预置定义优先级的值:

    /**
     * The minimum priority that a thread can have.
     */
    public final static int MIN_PRIORITY = 1;
    
    /**
     * The default priority that is assigned to a thread.
     */
    public final static int NORM_PRIORITY = 5;

    /**
     * The maximum priority that a thread can have.
     */
    public final static int MAX_PRIORITY = 10;

关于优先级问题注意几个点:

  • 线程优先级具有继承性
  • CPU尽量将资源让给优先级比较高的线程
  • 优先级具有随机性,也就是优先级较高的线程不一定会每一次都先执行完
高频网络协议与编程IO相关面试基本问题和知识点整理 网络IO相关基本高频面试基本问题和知识点整合 阅读详情

相关推荐

UE5.2 DynamicMesh避坑指南:从蓝图生成到物理碰撞的完整流程

本文详细解析了在UE5.2中使用DynamicMesh组件时,如何正确选择ADynamicMeshActor与AGeneratedDynamicMeshActor,并提供了从蓝图生成、初始化到配置物理碰撞的完整避坑流程。重点解决了SpawnActor失效、碰撞更新等常见问题,帮助开发者高效实现程序化网格生成与动态变形效果。

rrr55的博客 314

Java多线程Thread

Java多线程Thread多线程实现原理线程内存图创建多线程的多种方法自定义Thread子类实现Runnable接口实现Runnable接口创建多线程程序的好处使用匿名内部类线程的方法获取线程的名称设置线程名称线程暂停(睡眠)方法 sleep 多线程实现原理 线程内存图 创建多线程的多种方法 自定义Thread子类 class MyThread extends Thread{ @Override public void run() { for (int i = 0; i

qq_43609524的博客 1994

Western blot (WB) 灰度分析进阶指南:ImageJ 高效定量技巧与实战优化

本文详细介绍了使用ImageJ进行Western blot灰度分析的进阶技巧,包括批量处理、背景校正和疑难条带处理等实战优化方法。通过自动化宏脚本和动态背景校正,显著提升分析效率和准确性,特别适合科研人员处理复杂WB数据。

weixin_42557830的博客 899

Java多线程Thread详细讲解(万字教程)

一、线程的基本概念   线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。 好处:(1)易于调度。 (2)提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。 (3)开销少。创...

java小白翻身 2954

Spring AI RAG 生产级实战:从 0 构建企业智能知识库系统

Spring AI🎯统一的 API 抽象:屏蔽不同 AI 服务商的差异🎯开箱即用的集成:支持主流大模型和向量数据库🎯Spring 生态融合:与 Spring Boot、Spring Data 无缝集成🎯企业级特性:事务管理、监控、安全等RAG 架构:检索 + 增强 + 生成,解决 LLM 局限性Spring AI:统一的 API 抽象,简化 AI 应用开发向量数据库:pgvector 适合中小规模,Milvus 适合大规模文档处理:加载 → 分块 → 向量化 → 存储检索优化。

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 403

手把手教你用SIMCOM A7670C_FASL模组实现双路MQTT连接阿里云(附完整源码)

本文详细介绍了如何使用SIMCOM A7670C_FASL 4G模组实现双路MQTT连接阿里云,包括硬件配置、开发环境搭建、双路MQTT架构设计及实现细节。通过完整的源码示例和实战指南,帮助开发者快速掌握物联网设备开发中的多路MQTT连接技术,提升工业级应用的开发效率。

weixin_33696822的博客 226

java reactor 多线程_Reactor系列(十七)parallel多线程

#java#reactor#flux#parallet#多线程FluxMonoTestCase.javapackagecom.example.reactor;importlombok.extern.slf4j.Slf4j;importorg.junit.jupiter.api.Test;importreactor.core.publisher.Flux;importreactor.core.sch...

weixin_30811007的博客 591

【嵌入式Linux】EC20模块多运营商自适应PPP拨号实战:从IMSI识别到网络配置

本文详细介绍了在嵌入式Linux系统中,如何基于EC20 4G模块实现多运营商自适应PPP拨号。通过解析SIM卡的IMSI识别运营商,并动态配置对应的APN和拨号参数,结合AT指令交互与健壮的pppd脚本,解决了设备跨地域部署时的网络自动连接问题,提升了物联网设备的部署效率和稳定性。

fox11的博客 900

java多线程2:Thread中的方法

静态方法: Thread类中的静态方法表示操作的线程是" 正在执行静态方法所在的代码块的线程"。 为什么Thread类中要有静态方法,这样就能对CPU 当前正在运行的线程进行操作。下面来看一下Thread类中的静态方法: 1:currentThread /** * Returns a reference to the currently executing thread object. * * @return the currently executing th..

qq_64513388的博客 400

C# 上位机内存泄漏排查指南:3 个工具 + 4 个技巧,从 GC 频繁到稳定运行 720 小时

C# 上位机内存泄漏排查的核心是「先定位泄漏存在,再追溯引用根源,最后修复验证通过「Visual Studio 诊断工具(快速定位)+ dotMemory(深度分析)+ PerfView(生产监控)」三个工具的配合,结合「复现场景、排查静态成员+事件、检查非托管资源、GC 日志验证」四个技巧,可高效解决绝大多数泄漏问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 735

【1.2】Costas环的基本原理概述

Costas环是一种用于载波恢复的相干解调技术,可直接从BPSK等抑制载波信号中恢复本地载波并完成解调。其核心结构包含同相/正交双支路处理,通过混频、低通滤波后,利用I/Q支路信号乘积进行相位误差检测,经环路滤波器调节VCO输出频率,实现载波同步。课程将重点讲解Costas环的MATLAB仿真实现、系统性能分析及FPGA开发,包括信号产生、频偏模拟、滤波器设计等模块,并通过AWGN信道和不同频偏条件下的测试验证系统性能。该技术无需单独提取载波,在数字通信系统中具有重要应用价值。

fpga/matlab/simulink算法仿真工程 450

线程基础学习笔记(一)

1、线程概述进程:计算机中特定功能的程序在数据集上的一次运行线程:是进程的一个单元多线程:一个进程中有多个线程在同时运行JVM是多线程的,在我们运行JVM的时候后台会运行垃圾回收的线程,来清理没有被引用的对象2、线程的实现方法(Thread)1)将声明类Thread的子类,该子类应重写Thread类的run方法package com.cn.tx; public class CountThread...

baidu_41924510的博客 226

Agentic AI商业化落地指南:提示工程架构师的7步优化法

Agentic AI(具备自主感知、决策与行动能力的智能体系统)是未来AI商业化的核心方向,其价值在于将大模型的“认知能力”转化为“实际行动”,解决复杂商业场景中的自动化与个性化需求。而提示工程(Prompt Engineering)作为连接人类意图与智能体行为的“翻译器”,直接决定了智能体的可控性、效率与用户体验,是Agentic AI商业化落地的关键支撑。本文结合第一性原理与工程实践,提出提示工程架构师的“7步优化法”,覆盖从“商业目标定义”到“规模化推广”的全流程。通过理论框架推导架构设计拆解。

AI架构全栈开发实战笔记 1万+

java多线程个人学习笔记

需要在创建的类中重写run()方法,并将实现线程功能的代码写入run()方法,然后调用Thread类的start()方法执行线程。如果多线程程序中: 存在一个线程,现在需要插入另一个线程,要求插入的线程结束才能继续执行原来的线程,此时就需要用到join()方法。当创建一个新线程时,如果没有显式设置优先级,它将继承父线程的优先级,默认情况下父线程优先级为。每一个线程都有各自的优先级,如果有很多线程处于就绪状态,系统就会根据优先级来决定那个线程进入运行状态。线程是程序执行的最小单位,属于进程的一个执行单位,

2401_84040384的博客 835

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Java学习笔记-多线程

线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。进程是程序的基本执行实体。当核心线程都在运行以及任务队列满之后才能运行临时线程。都满了之后,舍弃任务10/** 参数一:核心线程数量 >=0* 参数二:最大线程数 >0 最大数量 >= 核心线程数量* 参数三:空闲线程最大存活时间 >=0* 参数四:时间单位 用TimeUnit指定* 参数五:任务队列 不能为null* 参数六:创建线程工厂 不能为null* 参数七:任务的拒绝策略 不能为null。

qq_45773654的博客 884

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【自用学习笔记】Java多线程

进程中的线程是由CPU负责调度执行的,但CPU能同时处理线程的数量有限,为了保证全部线程都能往前执行,CPU会轮询为系统的每个线程服务,由于CPU切换的速度很快,给我们的。加锁:每次只允许一个线程加锁,加锁后才能进入访问,访问完毕后自动解锁,然后其他线程才能再加锁进来。多线程是指从软硬件上实现的多条执行流程的技术(多条线程由CPU负责调度执行)程序中如果只有一条执行流程,那这个程序就是单线程的程序。线程是属于进程的,一个进程中可以同时运行很多个线程。正在运行的程序(软件)就是一个独立的进程。

qq_52726887的博客 630

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java中Thread类的基本认识与使用(如果想知道Java中有关Thread类的基本知识,那么只看这一篇就足够了!)

Java中Thread类的基本认识与使用(如果想知道Java中有关Thread类的基本知识,那么只看这一篇就足够了!)

秋刀鱼不做梦的编程日常 6625

Java多线程:常见的线程的创建方法及Thread类详解

线程是程序的执行流程的最小单元,一个进程(程序的执行实例)可以由一个或多个线程组成,每个线程都有自己的执行路径和执行状态。线程可以并发执行,即多个线程可以同时在不同的处理器核心或计算机上运行,从而提高程序的运行效率。线程与进程的区别在于,进程是操作系统对一个正在运行的程序的抽象,而线程是进程内部的一个执行单位。一个进程可以有多个线程,这些线程共享进程的资源,如内存空间、文件描述符等。线程之间可以通过共享内存的方式进行通信,相比于进程间通信(如管道、消息队列)的开销更小。

luming的博客 1651

初始JavaEE篇——多线程(1):Thread类的介绍与使用

创建线程:继承Thread类,实现Runnable接口,使用匿名内部类、查看线程状态、Thread类的常见属性与方法

我要学编程的博客 1804

【多线程】Thread 类及常见方法

1.Thread 类 在Java标准库中,提供有一个Thread,来表示/操作线程。 Thread 类也可以视为Java 标准库提供的API。 创建好的 Thread 实例,其实和操作系统中的线程是一一对应的关系。 操作系统,提供了一组关于线程API(C语言风格),Java对于这组API进一步封装了,就成了Thread类 2.创建线程 2.1继承Thread 类 通过Thread 类创建线程,最基本的做法就是创建子类,继承自Thread ,并且重写run方法 (1)继承Thread 来创建一

m0_60494863的博客 6289

Java多线程之线程的创建与Thread类的使用

本篇文章介绍java多线程中Thread类的使用以及有关线程对象创建和常用方法。

未见花闻的博客 3170

【多线程】认识Thread类及其常用方法

本文是对以往多线程学习中 Thread类 的介绍,以及对其中的部分细节问题进行总结。

一直往前走。 2856

Java多线程-Thread类的run方法

Java中的线程是基于操作系统的原生线程实现的,而start0()方法主要就是与操作系统进行交互,创建和启动新的系统级线程。以上执行逻辑可能因不同的JVM实现和不同的操作系统有所不同,具体实现代码可以在JVM的源代码中找到。(3)在新的系统级线程上调用Java线程对象的run()方法。通过上面的分析,要让线程执行某段逻辑的关键是,实现run方法。(2)传入一个实现了run方法的Runnable接口的实现类。(2)将Java线程对象与新创建的系统级线程进行关联。(1)申请系统资源创建一个新的系统级线程。

南七行者的博客 2210

Java多线程的创建与Thread类的方法及使用

一个线程就是一个 “执行流”. 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 “同时” 执行着多份代码.举个例子如下场景:一家公司要去银行办理业务,既要进行财务转账,又要进行福利发放,还得进行缴社保。如果只有张三一个会计就会忙不过来,耗费的时间特别长。为了让业务更快的办理好,张三又找来两位同事李四、王五一起来帮助他,三个人分别负责一个事情,分别申请一个号码进行排队,自此就有了三个执行流共同完成任务,但本质上他们都是为了办理一家公司的业务。

积跬步以至千里 1009

【多线程】Thread类及常用方法

Thread 类对象是用来描述一个线程执行流的,每一个线程都有唯一的 Thread 类对象与之对应,而 JVM 会将这些 Thread 类对象组织起来用于线程调度和线程管理。在上面的代码中,我们通过创建继承Thread类的子类MyThread来创建一个线程并运行,与此同时,main方法中的主线程也在运行,这就形成了一个“并发”执行的多线程程序。非后台线程其实就是我们所创建的线程(包括主线程),而后台线程则是 JVM 在执行进程时的一些自带线程,当进程结束(非后台线程全部结束),后台进程也就结束了。

REGARD712的博客 1210

【Java】多线程(篇一) : 通过Thread类创建线程的方法

【Java】多线程:通过Thread类创建线程的方法 1. 创建一个类, 继承Thread, 重写run方法 用线程来写一个简单的 hello word: 多线程的无限循环 以及调试器 调试器 2. 创建一个类, 实现Runnable , 重写 run 方法

mmmocen的博客 1248
上一篇: JNI技术学习(一):在Java中调用C++/C代码
下一篇: JAVA 同时编译多个java文件
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值