Java并发编程-基础概念全解

1、基础

1.1、什么是进程和线程

  进程和线程都是操作系统所运行的程序运行的基本单元。进程可以说是是线程的集合。
  进程:从系统资源讲,进程都有自己独立的地址空间,一个进程的崩溃不会影响另一个进程的执行。
  线程:进程中的一个执行路径,一个进程中可以同时有多个线程在执行,当其中一个线程对公共资源做了修改,其他线程是可以看到的。

1.2、什么是并行和并发

  并行:多个cpu实例或者多台机器同时执行一段处理逻辑,是真正的同时。
  并发:通过cpu调度算法,让用户看上去同时执行,实际上从cpu操作层面不是真正的同时。并发往往在场景中有公用的资源,那么针对这个公用的资源往往产生瓶颈,我们会用TPS或者QPS来反应这个系统的处理能力。

  高并发编程的意义、好处和注意事项
  好处:充分利用cpu的资源、加快用户响应的时间,程序模块化,异步化
  问题:1、线程共享资源,存在冲突;
  2、容易导致死锁;
  3、启用太多的线程,就有搞垮机器的可能

1.3、Java线程基础

1.3.1、如何创建一个线程

  第一种方式:继承Thread类

package com.syw.study.thread;
public class Demo001_Thread extends Thread {
    @Override
    public void run() {
        System.out.println("我是一个线程。。。。。");
    }
    public static void main(String[] args) {
        Demo001_Thread t = new Demo001_Thread();
        t.start();
    }
}

  第二种方式:实现Runable接口

package com.syw.study.thread;
public class Demo003_Thread implements Runnable {
    @Override
    public void run() {
        System.out.println("我是一个实现了Runnable接口的线程.....");
    }
    public static void main(String[] args) {
        Thread t = new Thread(new Demo003_Thread());
        t.start();
    }
}

  第三种方式:匿名类

package com.syw.study.thread;
public class Demo004_Thread{
    public static void main(String[] args) {
        Thread t = new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("我是一内部匿名类线程.....");
            }
        });
        t.start();
    }
}

1.3.2、线程的状态、及它们之间的转换关系

  1、New:创建
  2、Runnable:准备好了
  3、Running:运行
  4、Blocked:阻塞
  5、Dead:死亡

  五种状态之间的关系,如下图:
  

  现在对以上图中12条线分别解释说明:
  1、Thread对象的start()方法,使线程由“新建”状态转变为“可运行状态”, 此状态下,线程在等待CPU资源;
  2、此时线程获得CPU资源,变为“运行”状态,开始执行自己的业务代码,即:run()方法中的代码;
  3、有三种情况,导致线程死亡,一、run()方法结束;二、线程响应Interrupt异常;三、抛出异常;
  4、Thread对象的yield()方法使得线程放弃当前分得的 CPU 时间,但是不使线程阻塞,即线程仍处于可执行状态,随时可能再次分得 CPU 时间。调用 yield() 的效果等价于调度程序认为该线程已执行了足够的时间从而转到另一个线程;
  5、6、Thread类的sleep()方法,让线程阻塞指定时间,此时如果它正占有某对象的锁,那么不会释放锁;指定时间一过,线程重新回到运行状态;
     Thread类的suspend()方法,同样也使线程进入阻塞状态,也不会释放锁,只不过需要resume()方法让线程回到运行状态;
  7、8、当前线程调用 XX线程.join() 方法,当前线程进入阻塞状态(当前线程调用了XX线程.wait()方法),直到XX线程执行完毕,当前线程回到Runnable状态(线程运行完毕后会调用自身的notifyAll()方法);
  9、10、当前线程在获得对象锁的情况下,调用该对象的wait()方法,会使用当前线程进入阻塞状态,直到其他线程调用此对象的notify() 或 notifyAll()方法;
  11、12、当前线程遇到synchronized关键字,如果此时锁被占用,则当前线程进入阻塞状态,等待其他线程调用notify() 或 notifyAll()方法,使自己进入Runnable状态,等待获得CPU执行时间;
  

1.4、线程的协作

...........

2、线程安全

...........

原文地址:https://www.cnblogs.com/liushengit/p/10015729.html

时间: 2025-01-21 21:47:15

Java并发编程-基础概念全解的相关文章

java并发编程基础概念

1.什么是进程和线程 1.1 进程是程序运行资源分配的最小单位 进程是操作系统进行资源分配的最小单位,其中资源包括:CPU.内存空间.磁盘IO等,同一进程中的多个线程共享该进程中的全部系统资源,而进程和进程之间是相互独立的.进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 进程是程序在计算机上的一次执行活动.当你运行一个程序,你就启动了一个进程.显然,程序是死的.静态的,进程是活的.动态的.进程可以分为系统进程和用户进程.凡是用于完成操作

4.java并发编程艺术-java并发编程基础

java从诞生开始就明智的选择了内置对多线程的支持,这使得java语言相比同一时期的其他语言具有明显的优势.线程作为操作系统调度的最小单元,多个线程能够同时执行,这将显著提升程序的性能,在多核环境中表现的更加明显.但是,过多的创建线程和对线程的不当管理也容易造成问题.本章将着重介绍java并发编程的基础知识,从启动一个线程到线程间不同的通信方式,最后通过简单的线程池示例以及应用(简单的Web服务器)来串联本章所介绍的内容. 1.线程简介 1.1 什么是线程 现代操作系统中在运行一个程序时,会为其

Java并发编程核心概念一览

并行相关概念 同步和异步 同步和异步通常来形容一次方法的调用.同步方法一旦开始,调用者必须等到方法结束才能执行后续动作:异步方法则是在调用该方法后不必等到该方法执行完就能执行后面的代码,该方法会在另一个线程异步执行,异步方法总是伴随着回调,通过回调来获得异步方法的执行结果. 并发和并行 很多人都将并发与并行混淆在一起,它们虽然都可以表示两个或者多个任务一起执行,但执行过程上是有区别的.并发是多个任务交替执行,多任务之间还是串行的:而并行是多个任务同时执行,和并发有本质区别. 对计算机而言,如果系

java并发编程基础——线程的创建

一.基础概念 1.进程和线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小.(线程是cpu调度的最小单位) 2.并发性和并行性 并行:是指同一时刻,有多条指令在多个处理器上同时执行 并发:是指在同一时刻只能有一条指令执行,但多个进程指令被快速轮换执行.通常多个进程可以在当个处理器上并发执行. 3.多进程和多线

Java 并发编程基础导航

一.中断模型:http://ifeve.com/java-interrupt-mechanism/ 1. 协作制度, 你要我中断,只是给我一个信号,我啥时候中断,是我的事情. 比如 T1调用T2.interrupt(),    T2 如果没有写  if (Thread.intterrupted()) { return or do something}或者 if ( Thread.isintterupted()) { return or do something}  T2鸟都不鸟T1 而且 如果T

Java并发编程基础

线程作为操作系统调度的最小单元,多个线程能够同时执行,这将显著提升程序性能,在多核环境中表现得更加明显.但是,过多地创建线程和对线程的不当管理也容易造成问. 什么是线程 现代操作系统在运行一个程序时,会为其创建一个进程.例如,启动一个Java程序,操作系统就会创建一个Java进程.现代操作系统调度的最小单元是线程,也叫轻量级进程(LightWeight Process),在一个进程里可以创建多个线程,这些线程都拥有各自的计数器.堆栈和局部变量等属性,并且能够访问共享的内存变量.处理器在这些线程上

java并发编程基础-ReentrantLock及LinkedBlockingQueue源码分析

ReentrantLock是一个较为常用的锁对象.在上次分析的uil开源项目中也多次被用到,下面谈谈其概念和基本使用. 概念 一个可重入的互斥锁定 Lock,它具有与使用 synchronized 相同的一些基本行为和语义,但功能更强大. 名词解释: 互斥 表示同一时刻,多个线程中,只能有一个线程能获得该锁.但是多个线程都可以调用lock方法,只有一个会成功,其他的线程会被阻塞,直到该锁被释放 可重入 模仿synchronized 的语义:如果线程进入由线程已经拥有的监控器保护的 synchro

Java并发编程系列(一)-线程的基本使用

最近在学习java并发编程基础.一切从简,以能理解概念为主. 并发编程肯定绕不过线程.这是最基础的. 那么就从在java中,如何使用线程开始. 继承Thread类 继承Thread类,重写run方法,new出对象,调用start方法. 在新启的线程里运行的就是重写的run方法. 1 /** 2 * 集成Thread类 实现run() 3 */ 4 public class C1 extends Thread { 5 6 @Override 7 public void run() { 8 try

python中并发编程基础1

并发编程基础概念 1.进程. 什么是进程? 正在运行的程序就是进程.程序只是代码. 什么是多道? 多道技术: 1.空间上的复用(内存).将内存分为几个部分,每个部分放入一个程序,这样同一时间在内存中就有了多道程序. 2.时间上的复用(CPU的分配).只有一个CPU,如果程序在运行过程中遇到了I/O阻塞或者运行时间足够长.操作系统会按照算法将CPU分配给其他程序使用,依次类推.直到第一个程序被重新分配到CPU会继续运行. 多道技术中的问题解决: 空间复用:程序之间的内存必须分割.这种分割需要在硬件