美文网首页Java技术文章一些收藏Java-多线程
《深入浅出Java多线程》--基础篇

《深入浅出Java多线程》--基础篇

作者: RmondJone | 来源:发表于2020-12-30 15:42 被阅读0次

一、进程与线程的基本概念

进程:就是应用程序在内存中分配的空间,也就是正在运行的程序,各个进程之间互不干扰。同时进程保存着程序每一个时刻运行的状态。(例如手机里的一个个App,一个App的运行就对应一个主进程)
线程:如果一个进程有多个子任务时,只能逐 个得执行这些子任务,很影响效率。于是人们提出了线程的概念,让一个线程 执多个子任务,这样一个进程就包含了多个线程,每个线程负责一个单独的子任务。(例如迅雷App,一个下载任务就对应着一个线程)

总之,进程和线程的提出极大的提高了操作提供的性能。进程让操作系统的并发性成为了可能,而线程让进程的内部并发成为了可能。

进程和线程的区别

进程是一个独立的运行环境,而线程是在进程中执行的一个任务。他们两个本质的区别是是否单独占有内存地址空间及其它系统资源(例如I/O)

  • 进程单独占有一定的内存地址空间,所以进程间存在内存隔离,数据是分开的,数据共享复杂但是同步简单,各个进程之间互不干扰;而线程共享所属进程占有的内存地址空间和资源,数据共享简单,但是同步复杂。
  • 进程单独占有一定的内存地址空间,一个进程出现问题不会影响其他进程,不影响主程序的稳定性,可靠性高;一个线程崩溃可能影响整个程序的稳定性, 可靠性较低。
  • 进程单独占有一定的内存地址空间,进程的创建和销毁不仅需要保存寄存器和栈信息,还需要资源的分配回收以及页调度,开销较大;线程只需要保存寄存器和栈信息,开销较小。

另外一个重要区别是,进程是操作系统进行资源分配的基本单位,而线程是操作系统进行调度的基本单位,即CPU分配时间的单位 。

二、Java多线程入门类和接口

JDK提供了 Thread 类和 Runnalble 接口来让我们实现自己的“线程”类:

  • 继承Thread 类并重写run()
  • 实现Runnalble 接口的run()
public class Demo {
  public static class MyThread extends Thread {
    @Override
    public void run() {
      System.out.println("MyThread");
    }
  }
  public static void main(String[] args) {
    Thread myThread = new MyThread();
     myThread.start();
  }
}
public class Demo {
   public static class MyThread implements Runnable {
     @Override
     public void run() {
        System.out.println("MyThread");
     }
   }
   public static void main(String[] args) {
     new MyThread().start();
     // Java 8 函数式编程,可以省略MyThread类
     new Thread(() -> {
        System.out.println("Java 8 匿名内部类");
     }).start();
   }
}

Thread类与Runnable接口的比较:

  • 由于Java“单继承,多实现”的特性,Runnable接口使用起来比Thread更灵活。
  • Runnable接口出现更符合面向对象,将线程单独进行对象的封装。
  • Runnable接口出现,降低了线程对象和线程任务的耦合性。

三、Java线程的状态及主要转化方法

Java线程的6个状态如下:

public enum State {
 NEW,//新建
 RUNNABLE,//运行
 BLOCKED,//锁定
 WAITING,//等待
 TIMED_WAITING,//定时等待
 TERMINATED;//终止
}
线程状态的转换

四、线程之间的通信

线程的通信是指线程之间以何种机制来交换信息。在编程中,线程之间的通信机制有两种,共享内存消息传递

(1)在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信,典型的共享内存通信方式就是通过共享对象进行通信。

共享内存的并发模型

采用这种的通讯方式的涉及的知识点有:

  • 锁(synchronized)
  • 信号量(volatile、Semaphore)

(2)在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。

采用这种的通讯方式的涉及的知识点有:

  • 基于 Object 类的 wait() 方法和 notify()通知/等待机制实现的线程通讯方式。
  • 基于“管道流”的通信方式(PipedWriter 、 PipedReader 、
    PipedOutputStream 、 PipedInputStream 。其中,前面两个是基于字符的,后面两个是基于字节流的)实现的线程通讯方式。

相关文章

  • java多线程相关

    (一) 基础篇 01.Java多线程系列--“基础篇”01之 基本概念 02.Java多线程系列--“基础篇”02...

  • Java多线程系列目录(共43篇)-转

    最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。 (一) 基础篇 Java多线程系列--“基础篇”0...

  • 《深入浅出Java多线程》--基础篇

    一、进程与线程的基本概念 进程:就是应用程序在内存中分配的空间,也就是正在运行的程序,各个进程之间互不干扰。同时进...

  • android 多线程 — 线程的面试题和答案

    这里都是我从各个地方找来的资料,鸣谢: Java多线程干货系列—(一)Java多线程基础 JAVA多线程和并发基础...

  • 技术体系

    一,java核心 java基础,jvm,算法,多线程,设计模式 Java基础:java基础相关,全栈java基础 ...

  • 多线程--同步与锁

    同步与锁 上一篇中,笔者介绍了Java多线程的基础知识,主要讲解了进程/线程的区别、Java多线程的创建、Java...

  • Java多线程目录

    Java多线程目录 Java多线程1 线程基础Java多线程2 多个线程之间共享数据Java多线程3 原子性操作类...

  • Java基础

    Java基础 集合基础 集合框架 多线程基础 多线程框架 反射 代理 集合基础 ArrayList LinkedL...

  • Java多线程高级特性(JDK8)

    [TOC] 一、Java多线程 1.Java多线程基础知识 Java 给多线程编程提供了内置的支持。一条线程指的是...

  • [Java篇] Java 多线程基础

    多线程编程是java编程最重要的模块之一,对于不同的OS,线程和进程的理解是不一样的,向mac os就没有prog...

网友评论

    本文标题:《深入浅出Java多线程》--基础篇

    本文链接:https://www.haomeiwen.com/subject/bzzcoktx.html