首页 > 其他分享 >多线程

多线程

时间:2023-03-06 19:47:26浏览次数:33  
标签:同步 Thread 对象 Runnable sleep 线程 多线程

多线程

概念

程序

  为了完成某个任务或功能,选择某个编程语言而编写的一组代码指令的集合

进程

  程序的一次运行,是操作系统管理和调度的最小单位,每一个进程之间内存是相互独立的,如果进程之间要通信比较麻烦,可以通过文件,或网络通信方式等

线程

  是进程中的其中一条执行路径,是CPU调度任务的最小单位

  线程是共享同一个进程的内存

如何开启主线程以外的线程

方式一:继承java.lang.Thread类   

  ①继承Thread类
  ②重写public void run(){}编写线程体,即该线程需要完成的任务代码
  ③创建线程对象
  ④启动线程:线程对象.start();

方式二:实现java.lang.Runnable接口

  ①实现java.lang.Runnable接口
  ②实现public void run(){}编写线程体,即该线程需要完成的任务代码
  ③创建线程对象
  ④启动线程:借助Thread类的对象new Thread(自定义线程对象).start();

两种方式的区别

  区别:
  (1)继承Thread类会有单继承的限制 实现Runnable接口不会有单继承的限制
  (2)继承Thread类的方式,共享数据方面比较麻烦,使用static方式 实现Runnable接口,共享数据时,只需要共用同一个的Runnable接口的实现类的对象即可
  (3)继承Thread类的方式,同步的锁的选择要么选择一个static对象作为锁,要么选择“类名.class即当前类Class对象” 实现Runnable接口,同步锁可以直接选择this对象

线程安全问题

前提条件  

  (1)有多个线程
  (2)共享数据
  (3)多条语句操作共享数据

解决方法

  同步synchronized

    形式

//同步代码块
synchronized(锁对象){
    同步代码,即需要加锁的代码
}
//同步方法
synchronized [修饰符] 返回值类型 方法名(形参列表)抛出的异常列表

    同步锁

     (1)任意类型的对象
     (2)保证使用共享数据的多个线程,共用同一个锁对象

    锁的范围 同步代码块:范围

     (1)不能太大:机会不均匀
     (2)不能太小:安全问题没解决
     (3)最好锁一次任务代码

    同步方法的锁:  

      静态方法的锁:当前类的Class对象,即当前类名.class 非静态方法的锁:当前对象,this

线程通信

问题:生产者消费者问题

  问题  现象描述

    有多个线程共享一个缓冲区(例如:数据仓库,文件等),有的线程往里放数据,有的线程往外取数据

    问题有两个

      问题:线程安全问题  因为有共享数据  如何解决:同步

      问题:缓冲区大小有限的  如何解决:线程通信

线程通信的方法

  (1)wait()
  (2)notify()和notifyAll()

    在java.lang.Object   为什么

      线程通信依赖于锁对象,即wait()和notify()是由锁对象调用

      锁对象可能是任意类型的对象,那么这些方法只能在Object类中声明

  面试题:wait()和sleep()的异同?

    同  这两个方法都会导致当前线程从运行状态到阻塞状态

    不同

      从阻塞回到就绪状态

        sleep()睡眠时间到了

        wait()也可以设置时间,但更多时候是通过notify()

      声明的类不同

        wait是Object中,非静态方法

        sleep是Thread类中,静态方法

      锁释放问题

        sleep:不会释放锁的  例如:在卫生间睡着了,锁还在手上

        wait():会释放锁的  例如:抢到锁了,但是因为一些条件不满足,就释放锁,由其他线程执行

java.lang.Thread

方法

  1、获取线程名称的方法  getName()

  2、获取当前线程对象  Thread.currentThread()

  3、线程休眠  Thread.sleep(毫秒)  Thread.sleep(毫秒,纳秒)

  4、线程的优先级

    getPriority()

    setPriority()

      优先级的范围是1-10

      MAX_PRIORITY:10

      MIN_PRIORITY:1

      NORMAL_PRIORITY:5

    注意:业务逻辑不能依赖于优先级

  5、加塞

    join()  这句代码写在那个线程体中,哪个线程被加塞,被调用这个join()的线程加塞

  6、run():所有线程都要写

  7、start():启动线程

生命周期

 

标签:同步,Thread,对象,Runnable,sleep,线程,多线程
From: https://www.cnblogs.com/woniupa/p/17183667.html

相关文章

  • 使用python多线程检测ip地址
    #检测得ip地址在C:\Users\admin\Desktop\iplist.txt文件中importsubprocessimportthreadingimportIPyimportrefromqueueimportQueueimporttimeip_use=[]#检......
  • java多线程分析
    在java多线程中编程中,异常处理非常重要,会影响应用程序的整体运行情况。1、线程中可以捕捉的异常我们在普通的方法中,是支持exception往上层throw,简单来说,就是当前逻辑不......
  • JAVA多线程(四)--锁的定义
    一、乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次拿数据时都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这......
  • Spring Boot @Scheduled 是同步还是异步,单线程还是多线程?
    @schedule刚开始用的时候回遇到一些坑,主要就是他的同步、异步、多线程的配置问题,这篇文章介绍了@schedule的使用方法,读者遇到问题时可以参考下。1.问题@schedule注解默......
  • 多线程
    #线程类fromthreadingimportThreaddeffunc():foriinrange(1000):print("func",1)if__name__=='__main__':t=Thread(target=func......
  • 全局视角看技术-Java多线程演进史
    作者:京东科技文涛全文较长共6468字,语言通俗易懂,是一篇具有大纲性质的关于多线程的梳理,作者从历史演进的角度讲了多线程相关知识体系,让你知其然知其所以然。前言2022......
  • 【C#异步】异步多线程的本质,上下文流转和同步
    引言net同僚对于async和await的话题真的是经久不衰,这段时间又看到了关于这方面的讨论,最终也没有得出什么结论,其实要弄懂这个东西,并没有那么复杂,简单的从本质上来......
  • Java实验-Swing 简单多线程实验
    实验要求:多线程是生活中常见的现象,我们要让计算机程序同时做N件事,就可以通过多线程实现:如图所示,分别用Thread和Runnable两种方法各开2条线程,实现如下界面,每条线程的数字......
  • 多线程模型之生产者消费者 -- 转载
    https://www.cnblogs.com/pandamohist/p/13852197.html互斥量std::mutex:解决多个线程对共享数据的访问问题。条件变量std::condition_variable:是一种线程间的通讯机制,......
  • java 如何使用多线程调用类的静态方法?
     1.情景展示静态方法内部实现:将指定内容生成图片格式的二维码;如何通过多线程实现?2.分析之所以采用多线程,是为了节省时间 3.解决方案准备工作logo文件......