多线程

【java多线程编程】三种多线程的实现方式 文章目录前言进程与线程继承Thread类,实现多线程FAQ 为什么多线程的启动不直接使用run()方法而必须使用Thread类中start()方法呢?基于Runnable接口实现多线程Thread 与 Runnable 的关系Callable实现多线程线程运行状态 前言       在java语言最大的特点是支持多线程的开发(也是为数不多... 阅读详情


多线程

我们先来说说进程和线程,什么是进程?



图上就是进程,你会发现我的电脑运行多个进程


1.线程永远要依附于进程存在,在每个进程上可以继续划分出若干个线程,

2.线程的操作一定是要比进程更快,

小点:所有的线程都是交替执行,本身是没有固定的执行顺序的

说了那么多,直接上图

-----------------------------------------------------------------------分割线--------------------------------------------------------------------------


由于线程的启动需要牵扯到操作系统中资源的分配问题,所以具体的线程的启动应该要
根据不同的操作系统有不同的实现,而JVM相当于根据系统中定义的start0()方法来根据不同的操作系统进行该方法的实现,这样在多线程的层次上start0()方法名称不改变,而不同的操作系统上有不同的实现。

结论:只有Thread类的start()方法才能够进行操作系统的资源分配,所以启动多线程的方式永远就是调用Thread类的Start()方法实现。                                             
继承Thread类会产生单继承的局限操作,所以现在最好的做好是利用接口来解决问题,于是就可以Runnable接口来完成操作。

-----------------------------------------------------------------------分割线--------------------------------------------------------------------------



三种实现方式

第一种:Thread实现,,直接上代码




第二种:Runnable接口实现




第三种:实现Callable接口


从JDK1.5之后对于多线程的实现多了一个callable接口。在这个接口里面比Runnable接口唯一的强大之处在于它可以返回执行结果。此接口定义在Java.util.concurrent包中定义。

@FunctionalInterface

public interface Callable<V>{

      public V call()throws Exception
)
这个泛型表示的是返回值类型。Call()方法就相当于run()方法。

-----------------------------------------------------------------------分割线--------------------------------------------------------------------------

总结:

Thread有单继承局限 所以不使用,但是所有的线程对象一定要通过Thread里中的start()方法启动。

Runnable使用时可以避免单继承局限,所以建议使用此操作。

Callable比Runnable唯一的好处是多了返回值的数据。


-----------------------------------------------------------------------分割线--------------------------------------------------------------------------

构造方法:public Thread(Runnable target,String name)
设置名字:public final void setName(String name)
取得名字:public final String getName()

 

//MyThread线程类:main   (mt.run();)

//MyThread线程类:Thread-0   (newThread(mt).start();)

 

每当使用Java命令在JVM上解释某一个程序执行的时候,那么都会默认的启动一个JVM的进程,而主方法只是这进程中的一个线程,所以整个程序一直都在跑在线程的运行机制上。

每一个JVM至少会启动两个线程:主线程(main),GC线程

-----------------------------------------------------------------------分割线--------------------------------------------------------------------------

线程的休眠:

休眠方法:

publicstatic void sleep(long millis)throws InterruptedException

如果休眠的时间没到,就停止休眠了,那么就会产生中断异常

------------------------------------------------------------------------分割线-------------------------------------------------------------------------

线程的优先级
从理论上来讲 优先级越高的线程越有可能执行
       设置优先级:intpublic final  getPriority()

而对于优先级一共定义三种:
最高优先级:public static final int MAX_PRIORITY   10
中等优先级: public static final int NORM_PRIORIT5
最低优先级:public static final int MIN_PRIORITY   1

 

 

System.out.println(Thread.currentThread().getPriority());

主线程属于中等优先级 5

 

总结:

1.线程要有名字:Thread.currentThread取得当前线程

2.线程的休眠是有先后顺序的

3.理论上线程的优先级越高越有可能先执行

------------------------------------------------分割线---------------------------------------------

线程同步的处理

 

如果要想在若干行代码上实现锁这个概念,那么就需要通过使用同步代码块同步方法来解决

 

同步代码块:使用synchronized关键字定义的代码块就称为同步代码块,但是在进行同步的时候需要设
置有一个同步对象,那么往往可以 this同步当前对象。





在多个线程访问同一资源,一定要考虑到数据的同步问题,同步就使用synchronized

---------------------------------------分割线-----------------------------


死锁是一种不确定的状态,对于死锁的操作应该出现的越少越好,

代码不做任何实际

面试题:请问多个线程访问同一资源时可能带来什么问题?以及会产生什么样的附加问

题?

1.多个线程访问同一资源时必须要考虑同步,可以使用synchronized定义同步代码块或同步的

方法

2.程序中如果出现过多的同步那么就将产生死锁

 

总结:如果看见了synchronized声明的方法,一定要记住,这是一个同步方法,属于线程安全的操作,

性能不会特别的高

------------------------------------------------分割线---------------------------------------------

以上是本人在工作,学习之余的一点总结,(还是小白一枚委屈

当然还有很多不足,勿ping 缺点欢迎指出!

 
 
Ruby 多线程 多线程是一种允许单个程序同时执行多个任务的技术。在传统的单线程程序中,任务通常是顺序执行的,这意味着如果一个任务需要较长时间才能完成,它会阻塞后续任务的执行。而在多线程环境中,程序可以同时运行多个线程,每个线程执行一个独立的任务,从而提高了程序的效率和响应速度。 阅读详情

相关推荐

【JavaEE初阶】之 多线程基础【上篇】

多线程基础讲解

m0_62547912的博客 772

Java中的神秘之旅:揭秘native修饰的start0()方法的实现

在Java中,拥有多线程能力是其强大之处之一。然而,你是否曾经好奇过在Java中如何启动一个线程?这其中涉及到一个神秘的方法——start0()。让我们一起揭开这个谜团,探索start0()方法的具体实现。start0()通过本文,我们对Java中的start0()方法有了更深入的了解。这个本地方法作为线程启动的关键步骤之一,负责分配资源、创建操作系统级线程,并进行状态更新。虽然我们通常不需要直接操作它,了解其实现细节可以帮助我们更好地理解Java多线程机制。

一名Java语言狂热分子。 757

STM32F4_LCD显示汉字

LCD显示汉字和显示图片、数字、字符的原理是一样的,都是将汉字、图片、数字以及字符转换点阵,进而通过函数扫描点阵在LCD上显示;

light_2025的博客 1万+

聊一聊多线程的 run() 和 start(),挖一挖start0

首先是结论,应该大家知道: 调用start() 会触发多线程执行 ; 调用run() 还是当做执行了一个普通方法,没有多线程执行。 start()示例: public class MyThread extends Thread { @SneakyThrows @Override public void run(){ sleep(5000); System.out.println("run 内容打印 "); } publ..

默默不代表沉默 4313

java中线程启动过程分析及本地方法 start0源代码的追踪学习

java中线程启动过程分析及本地方法 start0源代码的追踪学习

fengxiandada的博客 2217

java的Thread类start0方法源码

带着几个问题去看源码 1、如何找到native方法的源码 2、Java的Thread对象、JavaThread、OSThread、操作系统线程 3、Java线程与操作系统线程的关联 4、Java线程保存了哪些操作系统线程数据 5、怎么执行到run方法的 首先第一个问题native的方法是通过jin与c/c++进行通信的jin有个规则一个java类中有native方法那么就会有一个.h的文件.h文件是c/c++用来定义变量、方法的所以想看native方法的源码可以直接去jdk源码搜索类名找它的.c或.cpp文

计算机王的博客 3793

Thread start0 多线程源码分析

第一步中,虽然new出来了这个worker对象,但是线程还没开始创建。就像工厂 里刚刚招进来一个打螺丝的,这个打螺丝的人刚入职是还没开始工作。 2、start()源码 进入start()方法。start方法会调用本地方法start0。 3、为什么调用start()能启动run() 看start方法的注释。 总结来说,当调用start方法的时候,会调用start0方法,start0方法是个JNI方法,会调用JVM,JVM最后回调run方法。所以不能直接调用run方法。要通过start0这个JN

MaginaD的博客 980

Arduino的多线程

前言 本章节是如何使用Arduino 的多线程技术。截止目前,Arduino 的性能很棒,但是如果我们想在不同的时间间隔中,完成两件、多件的任务呢? 此时,我们就需要使用一种类多线程技术来处理项目。 Arduino 的多线程 \ 类多线程? 为了正确理解多线程技术和Arduino 之间的关系,我们需要理解为什么它不是真正的多线程。 在计算机CPU上,多线程应用程序...

TEST_PROGRAM_NONE 3万+

多线程一,什么是多线程,创建多线程的几种方式

1 多线程相关概念 并发(Concurrent):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。 同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 并行(Parallel):当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为

世上哪有什么岁月静好,不过是有人替你负重前行 2万+

多线程详解

​​学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:想系统/深入学习某技术知识点…一个人摸索学习很难坚持,想组团高效学习…想写博客但无从下手,急需写作干货注入能量…热爱写作,愿意让自己成为更好的人…...

m0_65144570的博客 2030

Qt多线程

Qt 提供了多种方式来处理多线程编程,它不仅使多线程操作更易于管理,还与 Qt 的事件驱动架构紧密集成。下面是 Qt 多线程编程的详细介绍,包括关键类、模式以及常见的使用场景。

強雲的博客 1791

C++多线程-多线程调试

软件调试是我们软件开发过程中的重要一课。在前面,我们也讨论过程序调试,比如说这里。今天,我们还可以就软件调试多讲一些内容。比如说条件断点,数据断点,多线程断点等等。 #include <stdio.h> int value = 0; void test() { int total; int index; total = 0; ...

逍遥云恋 1945

什么是多线程

什么是多线程多线程是一种同时执行多个线程的技术,它不允许进程或操作系统生成计算机中运行的程序的多个副本,而是在不创建程序多个副本的情况下,同时管理多个用户或同一用户的多个请求。 线程是轻量级进程,是处理的最小单元,同时运行多个线程称为多线程。因此,基本上,这是一种由多个处理器使用单个代码集的方法。 了解多线程 1.为了理解多线程,需要理解两个术语。 (1)线程:线程是进程的独立或基本单元。 (2)进程:正在执行的程序称为进程,一个进程中存在多个线程。 2.多线程中的执行是并发的和并行的。 (1)并发执行

qf2019的博客 1万+

一文讲清多线程多线程同步

一个进程内多个线程并发执行的情况就叫多线程,每个线程是一个独立的执行流,多线程是一种编程模型,它与处理器无关、跟设计有关。并行计算:充分利用多核,提升整体吞吐,加快执行速度。后台任务处理:将后台线程和主线程分离,在特定场景它是不可或缺的,如:响应式用户界面、实时系统等。我们用2个例子作说明。同一进程内的多个线程会共享数据,对共享数据的并发访问会出现(竞争状况)。协调多个线程对共享数据的访问,避免出现数据不一致的情况。

excellent_fish_c的博客 1396

php 怎么实现多线程,php 实现多线程

通过php的Socket方式实现php程序的多线程。php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的。每一个访问者,当访问WEB页面的时候,都将调用新的线程,通过这一点我们可以利用WEB服务器自身的线程来解决PHP不支持多线程的问题。下面给出通过 fsockopen() 建立socket连接,然后用 用fputs() 发送消息,来实现的PHP...

weixin_28756427的博客 9873

进程与多线程(入门)

要了解什么是线程,得先知道什么是。:为完成特定任务,用某种语言编写的一组指令的集合。例如,QQ,Steam,亦或者java写的helloword。这些都是程序了解了程序,还得清楚什么是:就是指运行中的程序,比如双击QQ,那么就会启动了一个进程,操作系统就会为其分配该进程所需的内存空间,当又点开了一个程序,比如谷歌浏览器,那么就会又启动一个进程。进程是程序的一次执行过程,或是正在运行的一个程序,是一个动态的过程,有它自身产生,运行中,消亡的过程。

WINorYU的博客 742

Java线程的创建

昨天看了《CLR via C#》的第五部分——线程的处理,其中多处提到:创建一个线程的代价是非常昂贵的。但学习JAVA的时候并没有见到过类似的概念,只知道创建一个线程比创建一个进程代价小得多。于是有了两个疑问: 为什么创建线程的代价是昂贵的Java的线程是如何创建的?是直接调用OS的API,还是有自己的“抽象线程” 问题1: 仔细思考,这个问题应该相对的看,线程的创建最终还是要分配CPU

Jeff的专栏 3693

java Native Method初涉

    今天花了两个小时把一份关于什么是Native Method的英文文章好好了读了一遍,以下是我依据原文的理解。 一. 什么是Native Method    简单地讲,一个Native Method就是一个java调用非java代码的接口。一个Native Method是这样一个java的方法:该方法的实现由非java语言实现,比如C。这个特征并非java所特有,很多其它的编程语言都有这一...

ghsea 1568

Hotspot JVM 底层C/C++ 源码 Thread类start0源码

总所周知java里面开线程主要是通过native方法start0()来运行,先在源码搜一下 static JNINativeMethod methods[] = { {"start0", "()V", (void *)&JVM_StartThread}, //... }; 明显是调用一个JVM_StartThread方法 JVM_...

ronghost的博客 1862

YOLOv11改进 | 上采样篇 | YOLOv11引入CARAFE上采样

在本文中,我们提出了一个通用、轻量级、高效的特征重组算子CARAFE来实现这一目标.CARAFE有几个吸引人的特性:(1)大视场。(2)内容感知处理。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~大视场:不同于以往的方法(如双线性插值),CARAFE能够在更大的感受野内聚合上下文信息,从而捕获更丰富的语义信息。

tsg6698的博客 898

Delphi 13.1控件之SpComm Version 2.5.zip

Delphi 13.1控件之SpComm Version 2.5.zip

上一篇: MongoDB学习笔记(一) MongoDB介绍
Yrz11
博客等级 码龄10年 0粉丝 2原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值