java多线程详解

这篇具有很好参考价值的文章主要介绍了java多线程详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。简单理解为:引用软件中相互独立,可以同时允许的功能

进程是程序的基本执行实体

并发:在同一时刻,有多个指令在单个CPU上交替执行

并行:在同一时刻,有多个指令在多个CPU上同时执行

多线程的实现方式

  • 继承Thread类的方式进行实现
  • 实现Runnable接口进行实现
  • 利用Callable接口和Future接口的方式实现

方式一:

//将类声明为Thread类的子类,重写Thread类的run方法。
class MyThread() extends Thread{
    public void run(){
        //这里书写要执行的代码
        System.out.print("hello,xun");
        //
        System.out.print(getName())//获取当前线程的线程名
    }
}

MyThread mythread = new MyThread();
mythread.start();//启动线程

mythread.setName("线程一")//给线程起名字

方式二:

//声明实现Runnable接口的类,该类实现run方法。
class MyThread() implements Runnable{
    public void run(){
        //这里书写要执行的代码
        System.out.print("hello,xun");
        //获取当前线程对象
        Thread t = Thread.currentThread();
        t.getName();//获取当前线程的线程名
    }
}
//表示多线程要执行的任务
MyThread mythread = new MyThread();
//创建线程对象
Thread t = new Thread(mythread);
//开启线程
t.start(); 

t.setName("线程一")//给线程起名字

方式三:

//利用Callable接口和Future接口的方式实现
//特点:可以获取到多线程运行的结果
class MyCallable implements Callable<Integer>{//该线程返回值的类型
    public Integer call() throws Exception{
        //求1—100之间的和
        int sum=0;
        for(int i = 1;i<=100;i++){
            sum+=i;
        }
        return sum;
    }
}
//创建MyCallable的对象(表示多线程要执行的任务)
MyCallable mc = new MyCallable();
//创建FutureTask的对象(作用是管理多线程的运行结果)
FutureTask<Integer> ft = new FutureTask<>(mc);
//创建线程的对象
Thread t = new Thread(ft);
t.start();
//获取多线程的运行结果
Integer res = ft.get();

java多线程详解,java,java,开发语言

多线程中常用的成员方法

java多线程详解,java,java,开发语言

  1. 如果我们没有给线程设置名字,线程也是有默认名字的,格式:Thread-X(X是序号,从0开始)
  2. 如果给线程设置名字,有两种方法,1.通过setName设置线程名 2.通过构造函数设置线程名
  3. 当JVM虚拟机启动后,会自动运行多条线程,其中有一条线程叫main线程,他的作用就是调用main方法,执行里面的代码
  4. 线程的优先级,最小的是1,最大的10,默认是5;优先级越大,抢到CPU的概率越大
  5. 当其他的非守护线程执行完毕之后,守护线程会陆续结束(可能不会将自己的程序运行完)
  6. t.join()//表示将线程t插入到当前线程之前

线程的声明周期

java多线程详解,java,java,开发语言

线程安全问题

线程的执行有随机性,这样会导致线程存在安全问题

解决方法:

同步代码块:把操作共享的代码锁起来

synchronized(锁对象){
	//操作共享的代码块
}
//特点一:锁默认打开,有一个线程进去了,锁自动关闭
//特点二:里面的代码全部执行完毕,线程出来,锁自动打开
//锁对象一定是唯一的,一般是锁对象的字节码文件对象
synchronized(thread.class);

同步方法:把synchronized关键字加到方法上

格式:修饰符 synchronized 返回值类型 方法名(方法参数){...}
//特点一:同步方法是锁住方法里面的所有方法
//特点二:锁对象不能自己指定
	非静态方法:this
    静态方法:当前类的字节码文件对象

为了更加清晰的表达如何释放锁,获得锁,JDK5之后提供了一个锁对象Lock

void lock()//获得锁
void unlock()//释放锁
    //手动释放锁,手动获得锁

Lock是接口不能被直接实例化,使用它的实现类ReentrantLock来实例化

死锁

出现了锁的嵌套

产生因素

1、系统拥有的资源数量
2、资源分配策略
3、进程对资源的使用要求
4、并发进程的推荐顺序

必要条件

  • 互斥条件:进程互斥使用资源
  • 占有和等待条件:进程申请资源得不到时,不会释放已经占有的资源
  • 不剥夺条件:一个进程不能抢占其他进程的资源
  • 循环等待条件:存在一组进程循环等待资源

死锁的防止

破坏产生死锁的任意一个条件即可

生产者和消费者(等待唤醒机制)

生产者:生产数据

消费者:消费数据

常见方法:

public void wait();//当前线程等待,知道被其他线程唤醒

public void notify();//随机唤醒一个线程

public void notifyAll();//唤醒所有线程

线程的状态

java多线程详解,java,java,开发语言

新建状态(new)			->			创建线程对象

就绪状态(Runnable)			->			start方法

阻塞状态(blocked)			->			无法获得锁对象

等待状态(waiting)			->			wait方法		

计时状态(timed_waiting)			->			sleep方法

结束状态(terminated)			->			全部代码运行完毕

线程池

以前使用多线程的弊端:

​ 用到线程时就创建

​ 用完之后线程消失

这样会浪费操作系统的资源

线程池:类似于一个容器,里面有线程,需要用到线程时,直接取即可,用完还回去。

线程池有最大线程数量限制,可以自己设置文章来源地址https://www.toymoban.com/news/detail-824385.html

1. 创建一个空池子
2. 提交任务时,池子会创建新的线程对象,任务执行完毕,归还线程对象到线程池,下次调用时,直接使用,不需要创建
3. 如果提交任务时,没有空闲线程,也无法创建新的线程,任务就会排队等待

线程池:类似于一个容器,里面有线程,需要用到线程时,直接取即可,用完还回去。

线程池有最大线程数量限制,可以自己设置

1. 创建一个空池子
2. 提交任务时,池子会创建新的线程对象,任务执行完毕,归还线程对象到线程池,下次调用时,直接使用,不需要创建
3. 如果提交任务时,没有空闲线程,也无法创建新的线程,任务就会排队等待

到了这里,关于java多线程详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Java 基础篇】Java多线程编程详解:线程创建、同步、线程池与性能优化

    Java是一门强大的编程语言,其中最引人注目的特性之一是多线程支持。多线程允许我们在同一程序中同时执行多个任务,这大大提高了应用程序的性能和响应能力。本文将深入介绍Java线程的基础知识,无论您是初学者还是有一些经验的开发人员,都将从中获益。 在计算机科

    2024年02月07日
    浏览(44)
  • 【Java|多线程与高并发】线程池详解

    Java线程池是一种用于管理和重用线程的机制,它可以在需要执行任务时,从线程池中获取线程,执行任务,然后将线程放回池中,以便后续使用。线程池可以有效地管理线程的数量,提高程序的性能和资源利用率。 为什么从线程池里面取线程比直接创建线程快呢? 创建线程是

    2024年02月11日
    浏览(35)
  • Java线程生命周期详解

    Java中的线程生命周期是多线程开发的核心概念。了解线程的生命周期以及它们如何进行状态转换对于编写有效且无错误的多线程程序至关重要。 Java线程主要有以下几个状态,这些状态定义在Thread.State枚举类中: 新建状态(New) :当我们创建一个新的线程实例时,线程就处

    2024年02月11日
    浏览(31)
  • 【Java】详解多线程通信

    🌺 个人主页: Dawn黎明开始 🎀 系列专栏: Java ⭐ 每日一句:什么都不做,才会来不及 📢 欢迎大家:关注 🔍+ 点赞 👍+评论 📝+收藏⭐️ 文章目录 🔐多线程通信 (1).🔓由来 (2).🔓成员方法  (3).🔓案例引入 (4).🔓代码实现       现代社会崇尚合作精神,分工合作在日常

    2024年02月05日
    浏览(28)
  • Java 线程状态详解

    当一个线程对象被创建,但还没有调用其start()方法时,它处于新建状态。(内核里还没创建对应PCB) 当线程的run()方法执行完毕或线程被强制终止时,线程进入终止状态。(表示内核中的PCB已经执行完毕,但是Thread对象还在) 当线程对象调用了start()方法后,线程进入就绪状态。有

    2024年02月12日
    浏览(34)
  • java线程详解

    说到线程,就不得不提进程,为什么呢,因为进程是操作系统进行分配资源和调度的最小单位,比如windows系统安装的应用软件(office、qq、微信等)启动时,由操作系统协调分配资源和调度执行称之为一个进程,进程间是相互独立和隔离的。而线程是进程最小执行单位,一个

    2024年02月16日
    浏览(20)
  • java线程-synchronized详解

    解决线程原子性问题,最常见的手段就是加锁,Java提供了两种加锁的方式,一个synchronized隐式锁,另外一个是通过J.U.C框架提供的Lock显式加锁。本文主要介绍一个Synchronized的实现方式。 synchronized解决的是多个线程之间访问资源的同步性,synchronized 翻译为中文的意思是

    2024年02月10日
    浏览(38)
  • java多线程详解

    线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。简单理解为:引用软件中相互独立,可以同时允许的功能 进程是程序的基本执行实体 并发:在同一时刻,有多个指令在单个CPU上 交替 执行 并行:在同一时刻,有多个指令在多

    2024年01月25日
    浏览(26)
  • java---线程安全详解

    目录 前言 一、线程不安全产生的原因 1.多个线程同时修改一个变量 2.非原子性操作 3.内存可见性问题 4.指令重排序问题  二、线程安全的解决 1.加锁排队执行 1. 同步锁synchronized 2.可重入锁ReentrantLock 2.原子类AtomicInteger 总结 线程安全是指某个方法或某段代码,在多线程中能够

    2024年02月08日
    浏览(21)
  • 【Java系列】详解多线程(一)

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习Java的一点学习心得,欢迎大家在评论区交流讨论💌 在引入多线程之前, 我们先来看一下进程是为了干什么的,

    2024年02月05日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包