首页 > 系统相关 >Java并发(进程、线程、多线程,使用)

Java并发(进程、线程、多线程,使用)

时间:2022-10-13 15:55:05浏览次数:46  
标签:run Thread start 线程 Java 多线程 CPU

Java并发(进程、线程、多线程,使用)

进程和线程

  1. 定义

    进程:进程是计算机正在运行的一个独立的应用程序。

    线程:线程是组成进程的基本单位,可以完成特定的功能,一个进程是由一个或多个线程组成的。

    应用程序是静态的,进程和线程是动态的,有创建有销毁。

  2. 两者的区别:

    • 进程在运行时有独立的内存空间,各进程之间互不干扰。

    • 线程是共享内存空间的,但是每个线程的执行都是相互独立的,单独的线程是无法执行的,由进程来控制多个线程的执行。

多线程

  1. 定义

    多线程是指在一个进程中,多个线程同时执行,这里说的同时执行并不是真正意义的同时执行。

    系统会为每个线程分配CPU资源,在某个具体的时间段内CPU资源会被一个线程占用,在不同的时间段内由不同的线程来占用CPU资源,所以多个线程还是在交替执行,只不过因为CPU运行速度太快,我们感觉是在同时执行。

  2. 优点

    • 系统资源得到更合理的利用。
    • 程序设计更加简洁。
    • 程序响应更快,运行效率更高。
  3. 缺点

    • 需要更多的内存空间来支持。

    • 多线程并发访问的情况可能会影响数据的准确性。

    • 数据被多线程共享,可能会出现死锁的情况

      多线程并发--》数据不准确-->线程同步解决--》死锁

Java中使用线程

  1. 继承Thread类

    • 创建自定义类并继承Thread类。
    • 重写Thread类中的run方法,并编写程序的业务逻辑代码。
    public class MyThread extends Thread  {
        @Override
        public void run() {
            //业务代码
        }
    }
    
    • 使用
    public static void main(String[] args) {
            MyThread myThread1 = new MyThread();
            MyThread myThread2 = new MyThread();
            //不能用以下这种方法,否则就不是启动线程了,只是顺序执行两个线程的方法,即普通方法的调用
            myThread1.run();
            myThread2.run();
            //这才是正确的启动线程的方法
            myThread1.start();
            myThread2.start();
        }
    

    ​ 不能通过run方法来调用线程的任务,因为run方法调用相当于普通对象的执行,并不会去抢占CPU资 源。

    ​ 只有通过start方法才能开启线程,进而去抢占CPU资源,当某个线程抢占到CPU资源后,会自动调用run方法。

  2. 实现Runnable接口

    • 创建自定义类并实现Runnable接口。

    • 实现run方法,编写该线程的业务逻辑代码。

      public class MyRunnable implements Runnable  {
          @Override
          public void run() {
              //业务逻辑代码
          }
      }
      
    • 使用

      public static void main(String[] args) {
              MyRunnable myRunnable1 = new MyRunnable();
              MyRunnable myRunnable2 = new MyRunnable();
              //不能用以下这种方法,否则就不是启动线程了,只是顺序执行两个线程的方法,即普通方法的调用
              myRunnable1.run();
              myRunnable2.run();
              //也不能用以下这种方法,因为Runnable并没有start方法
              myRunnable1.start();
              myRunnable2.start();
          	//正确的方法
              Thread thread = new Thread();
              thread.start();
          }
      

    Runable不能使用start的原因是

    ​ 首先要搞清楚线程和任务的关系,线程是去抢占CPU资源的,任务是具体执行业务逻辑的,线程内部会包含一个任务,线程启动(start),抢占到CPU资源后,任务就开始执行(run)。

    ​ 所以我们Runnable里的run只是写了业务逻辑代码(任务),它是单独分出来了,如果此时不分配给线程他就是个死的东西,而Thread类集成了线程和任务,所以继承Thread类后可以直接start启动。

  3. 两种方式的区别

    1、MyThread,继承Thread类的方式,直接在类中重写run方法,使用的时候,直接实例化MyThread,start即可,因为Thread内部存在Runnable。

    2、MyRunnbale,实现 Runnable 接口的方法,在实现类中重写run方法,使用的时候,需要先创建Thread对象,并将MyRunnable注入到Thread中,再Thread.start。

    实际开发中推荐使用第二种方式。

标签:run,Thread,start,线程,Java,多线程,CPU
From: https://www.cnblogs.com/zwl-/p/16788410.html

相关文章

  • ajax+javascript+tp搜索页面跳转
      搜索页面代码:<formclass="a"action="/news/search.html"method="get"role="form"id="searchform"><divclass="form-group"><inputtype="tex......
  • 【JS】167-JavaScript设计模式——装饰者模式
    四、装饰者模式(DecoratorPattern)1.概念介绍装饰者模式(DecoratorPattern):在不改变原类和继承情况下,动态添加功能到对象中,通过包装一个对象实现一个新的具有原对象相同接口......
  • 【JS】169-JavaScript设计模式——外观模式
    六、外观模式(FacadePattern)1.概念介绍外观模式(FacadePattern) 是一种简单又常见的模式,它为一些复杂的子系统接口提供一个更高级的统一接口,方便对这些子系统的接口访问......
  • 【JS】168-JavaScript设计模式——策略模式
    五、策略模式(StrategyPattern)1.概念介绍策略模式(StrategyPattern):封装一系列算法,支持我们在运行时,使用相同接口,选择不同算法。它的目的是为了将算法的使用与算法的实现......
  • 【JS】166-JavaScript设计模式——迭代器模式
    三、迭代器模式(IteratorPattern)1.概念介绍迭代器模式(IteratorPattern) 是提供一种方法,顺序访问一个聚合对象中每个元素,并且不暴露该对象内部。这种模式属于行为型模式......
  • 【JS】172-JavaScript设计模式——观察者模式
    九、观察者模式(ObserverPatterns)1.概念介绍观察者模式(ObserverPatterns) 也称订阅/发布(subscriber/publisher)模式,这种模式下,一个对象订阅定一个对象的特定活动,并在状......
  • 【JS】170-JavaScript设计模式——代理模式
    七、代理模式(ProxyPattern)1.概念介绍代理模式(ProxyPattern) 为其他对象提供一种代理,来控制这个对象的访问,代理是在客户端和真实对象之间的介质。简单的理解:如我们需要......
  • 【JS】89-用JavaScript实现的5个常见函数
    前言    在学习 JavaScript,或者前端面试中,有人会问你节流函数、防抖函数、递归函数等,本文分享了5个常见函数,希望对你有所帮助。    在 JavaScript 中有一些问题......
  • Java 内存区域
     JAVA虚拟机在执行java程序过程中会把他所管理的内存划分为若干个不同的数据区域,包括以下几个运行时数据区域  1、程序计数器程序计数器是一块小的内存......
  • 【JavaScript】13-JS中常见设计模式
    开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。Ja......