【JAVA学习之路 | 提高篇】进程与线程(Thread)

简介: 【JAVA学习之路 | 提高篇】进程与线程(Thread)

1.相关概念

(1). 程序(program) : 为完成特定任务,用某种语言编写的一组指令的集合.即指一块静态的代码.


(2). 进程(progress) : 程序的一次执行过程,或者是正在运行中的应用程序(如正在运行的QQ,正在运行的网易第五人格).


  • 每一个进程都有一份独立的内存空间,系统运行一个程序便是进程创建到运行到销毁的过程.
  • 程序是静态的,而进程是动态的.
  • 进程作为操作系统调度和分配资源的最小单位,系统在运行时会为每个线程分配内存.
  • 现代的操作系统,大多支持多进程的,支持同时运行多个程序.(比如你边玩着第五人格,边开着QQ聊天界面跟女朋友聊天).

(3). 线程(thread) : 进程可进一步细化为线程,是程序内部的一条执行路径.一个进程至少有一个线程,可以有很多线程.

  • 一个进程同一时间如果并行运行多个线程,就是支持多线程的(比如毒王360,点开360便创建了一个进程,而你同时使用杀毒,清理垃圾等功能时,便是一个进程执行多个线程).
  • 线程作为CPU调度和执行的最小单位.
  • 一个进程的多个线程可以共享相同的内存单元.他们从同一个堆中分配对象,可以访问相同的对象.使得线程间的通信更方便简洁高效.但多个线程操作内存单元可能会带来安全隐患.
  • 线程独享区域 : 虚拟机栈,本地方法栈,程序计数器.
  • 线程共享区 : 堆(Heap),方法区(Method Area).

注 :

  • 不同进程之间是不共享内存的.
  • 而不同进程之间可以通信,但通信成本可能较高.

2.线程调度

(1). 分时调度 : 所有线程轮流使用CPU的使用权,并且平均分配每个线程占用CPU的运行时间.

(2). 抢占式调度 : 让优先级高的线程较大概率的占用CPU调用时间,如果所有线程优先级相同,那么将随机选择一个线程.java使用的便是该种调度.

3.多线程程序的优点

背景 : 以单核CPU为例,只使用单个线程先后完成多个任务,肯定比多个线程完成的时间更短,那为什么要使用多线程程序呢.

  1. 提高程序响应效率,对图形化界面更有意义,可以同时做多个事情.
  2. 提高计算机CPU的利用率.
  3. 改善程序结构.将既长又复杂的程序分成多个线程独立运行,利于理解和修改.

4.单核CPU与多核CPU

(1). 单核CPU : 在一个时间单元内,只执行一个线程的任务.可以把CPU看作是医生的诊室,每个人只能进去一个人进去看病.代码进过一系列前导操作,到CPU运行时发现只有一个医生,所以只能排队一次看病.


这时如果要提升系统性能,有两种方法 : 要么多核处理(一个医生给一个病人看病,换为多个医生给多个病人看病),要么提升CPU性能(让医生看病快点).


问 : 那么多核的CPU是单核的整数倍吗.理论上是不可能的.至少两方面损耗.

  • 其他共有资源的限制 : 4核CPU对应的寄存器,内存并没有扩充为单核的四倍.(就像四个医生给四个病人看病,但医院的b超机器还只是原来的一台).
  • 多个CPU的协调管理损耗 : 多个核心同时运行两个相关的任务,可能需要考虑到任务同步,这就需要损耗额外的性能.

5.并行与并发

(1). 并行(parallel) : 指两个及以上的任务同时发生,即同一时刻,多个任务在多个CPU上同时进行.

------------------------

------------------------


------------------------


(2). 并发(concurrency) : 指两个及以上的任务在同一时间段发生.即一个时间段,多个任务在单个CPU上快速轮转,交替执行.宏观上表现为并行.


-------                         ------


       ----------                                    ------


                   -----------          -----------

相关文章
|
2天前
|
安全 Java 程序员
Java多线程详解
Java多线程详解
|
2天前
|
缓存 安全 Java
Java线程面试题含答案
Java线程面试题含答案
|
2天前
|
存储 调度 C++
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
22 1
|
2天前
|
Scala
scala 读取文件(中文)异常 thread "main" java.nio.charset.MalformedInputException: Input length = 1
scala 读取文件(中文)异常 thread "main" java.nio.charset.MalformedInputException: Input length = 1
4 0
|
2天前
|
Java API
|
2天前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
|
2天前
|
存储 Linux C语言
c++进阶篇——初窥多线程(二) 基于C语言实现的多线程编写
本文介绍了C++中使用C语言的pthread库实现多线程编程。`pthread_create`用于创建新线程,`pthread_self`返回当前线程ID。示例展示了如何创建线程并打印线程ID,强调了线程同步的重要性,如使用`sleep`防止主线程提前结束导致子线程未执行完。`pthread_exit`用于线程退出,`pthread_join`用来等待并回收子线程,`pthread_detach`则分离线程。文中还提到了线程取消功能,通过`pthread_cancel`实现。这些基本操作是理解和使用C/C++多线程的关键。
|
4天前
|
安全 Java
【极客档案】Java 线程:解锁生命周期的秘密,成为多线程世界的主宰者!
【6月更文挑战第19天】Java多线程编程中,掌握线程生命周期是关键。创建线程可通过继承`Thread`或实现`Runnable`,调用`start()`使线程进入就绪状态。利用`synchronized`保证线程安全,处理阻塞状态,注意资源管理,如使用线程池优化。通过实践与总结,成为多线程编程的专家。
|
4天前
|
Java 开发者
告别单线程时代!Java 多线程入门:选继承 Thread 还是 Runnable?
【6月更文挑战第19天】在Java中,面对多任务需求时,开发者可以选择继承`Thread`或实现`Runnable`接口来创建线程。`Thread`继承直接但限制了单继承,而`Runnable`接口提供多实现的灵活性和资源共享。多线程能提升CPU利用率,适用于并发处理和提高响应速度,如在网络服务器中并发处理请求,增强程序性能。不论是选择哪种方式,都是迈向高效编程的重要一步。
|
4天前
|
Java 开发者
震惊!Java多线程的惊天秘密:你真的会创建线程吗?
【6月更文挑战第19天】Java多线程创建有两种主要方式:继承Thread类和实现Runnable接口。继承Thread限制了多重继承,适合简单场景;实现Runnable接口更灵活,可与其它继承结合,是更常见选择。了解其差异对于高效、健壮的多线程编程至关重要。