Java并发编程--进程与线程

进程:百度百科说“进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。”,维基百科说“是计算机中已运行程序的实体。进程本身不会运行,是线程的容器。”

线程:百度百科说“线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元”,维基百科说“是操作系统能够进行运算调度的最小单位。它被包涵在进程之中,是进程中的实际运作单位。”。

在弄清楚这些名词前,我们先看看是如何产生的。

在计算机刚诞生时,计算机只能接受一些特定的指令并执行,当用户输入指令时,计算机只能等待,这样效率很低,然后人们开始想,是不是可以把指令写一个清单,交给计算机去执行,如此,有了批处理操作系统;但是这时人们又发现了一个问题,比如当一个程序需要耗时较长的I/O操作时,cpu只能等待其读完数据,这样效率无疑也是比较低的。再然后人们又开始想,是不是当一个程序等待资源时是不是可以让另一个程序运行,待之前的程序资源准备完毕时再让其运行,相当于是内存中不仅仅只运行一个程序?进程产生了,用进程来对应一个程序,每个进程对应一定的内存地址空间,且只能用自己的,各个进程不互相干扰,同时,进程保存了程序每个时刻的运行状态,这样进程间就可以切换了。这样用户用起来感觉像是计算机同一时间在执行多个任务,称之为“并发”。说明:对于单核cpu来说,事实上一个时间只有一个进程占用cpu。

再然后,人们对计算机的实时性要求更高了,虽然可以执行多个进程了,但是执行一个进程时,一个进程一个时间段内只能做一件事情,那么可不可以再把进程切分成多个子任务,并发执行呢?于是人们又发明了线程,通过线程之间的切换,让用户感觉系统同时在做很多件事情。

进程让操作系统的并发性成为可能,线程让进程内部并发成为可能。

现在再看上面的解释,进程是系统资源分配和调度的基本单位,每个进程都独享自己的资源;一个进程可以包括多个线程,而线程是系统运算调度的最小单位,所以进程内部的多个线程是共享进程的资源的。

当然,上面的解释都要和物理设备相关,比如,cpu是单核的还是多核的等。

下面看一张资源监视器的图:

通过这张图可以很直观的看出,一个eclipse进程包含多个线程。进程和线程不是一个量级的对象,所以个人认为没有必要放在一起比较,和类和对象的关系比较类似。

时间: 2024-10-11 21:49:45

Java并发编程--进程与线程的相关文章

【java并发编程实战】-----线程基本概念

学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习Java并发编程,共同进步,互相指导. 在学习Java并发之前我们需要先理解一些基本的概念:共享.可变.线程安全性.线程同步.原子性.可见性.有序性. 共享和可变 要编写线程安全的代码,其核心在于对共享的和可变的状态进行访问. "共享"就意味着变量可以被多个线程同时访问.我们知道系统中的资

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

Java并发编程(01):线程的创建方式,状态周期管理

本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序,关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础.在早期面向进程设计的计算机结构中,进程是程序的基本执行实体:在面向线程设计的计算机结构中,进程是线程的容器.程序是指令.数据及其组织形式的描述,进程是程序的实体. 线程 线程是操作系统能够进行运算调度的最小单

并发编程 --- 进程,线程

目录 进程 线程 进程 1.进程互斥锁 异步可以让多个任务在几个进程中并发处理,他们之间没有运行顺序,一旦开启也不受我们的控制,尽管并发编程让我们更加充分的利用IO资源,但是当多个进程使用同一份资源的时候,就会引发数据安全或顺序混乱的问题 import json import time from multiprocessing import Process from multiprocessing import Lock # 查看余票 def search(user): # 打开data文件查看

Java并发编程(02):线程核心机制,基础概念扩展

本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效率.下面提供一个基础的演示案例. 2.应用案例 场景:假设有一个容器集合,需要拿出容器中的每个元素,进行加工处理,一般情况下直接遍历就好,如果数据偏大,可以根据线程数量对集合切割,每个线程处理一部分数据,这样处理时间就会减少很多. public class ExtendThread01 { publ

Java并发编程-如何终止线程

我们知道使用stop().suspend()等方法在终止与恢复线程有弊端,会造成线程不安全,那么问题来了,应该如何正确终止与恢复线程呢?这里可以使用两种方法: 1.使用interrupt()中断方法. 2.使用volatile boolean变量进行控制. 在使用interrupt方法之前,有必要介绍一下中断以及与interrupt相关的方法.中断可以理解为线程的一个标志位属性,表示一个运行中的线程是否被其他线程进行了中断操作.这里提到了其他线程,所以可以认为中断是线程之间进行通信的一种方式,简

Java并发编程学习:线程安全与锁优化

本文参考<深入理解java虚拟机第二版> 一.什么是线程安全? 这里我借<Java Concurrency In Practice>里面的话:当多个线程访问一个对象,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要额外的同步,或者调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那么这个对象是线程安全的. 我的理解:多线程访问一个对象,任何情况下,都能保持正确行为,就是对象就是安全的. 我们可以将Java语言中各种操作共享的数据分为以下5类:不可变.

JAVA - 并发编程 - 执行器和线程池

思考? 1 为什么要使用执行器和线程池? 2 执行器和线程是什么?怎么使用 执行器 线程执行器分离了任务的创建和执行,提高了线程的性能 线程池 避免了频繁地创建和销毁线程,达到线程对象的重用,可以根据项目灵活地控制并发的数量 ExecutorService (java.util.concurrent) 1 Executors.newCachedThreadPool() 可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程 2 Executors.newFixedT

(并发编程)进程池线程池--提交任务的2种方式、协程--yield greenlet,gevent模块

一:进程池与线程池(同步,异步+回调函数)先造个池子,然后放任务为什么要用"池":池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务池子内什么时候装进程:并发的任务属于计算密集型池子内什么时候装线程:并发的任务属于IO密集型 #提交任务的两种方式:    # 同步调用:提交完一个任务之后,就在原地等待,等待任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行的    # 异步调用:提交完一个任务之后,不在原地等待,结果???,而是