Java教程

Java多线程

本文主要是介绍Java多线程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1. 认识线程(Thread)

1.1 概念

a) 进程是为了实现并发编程的效果,但是为了追求更高的效率就引入了线程,线程也称作“轻量级进程”

b) 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个进程内的线程之间是可以共享资源, 每个进程至少有一个线程存在,即主线程

c) 每个线程就对应到一个"独立的执行流",在这个执行流里就能完成一系列的指令 ,如果有多个线程,就有了多个"执行流“,这样就可以并发的完成多个系列的指令了

1.2 线程的结构

线程控制块:与进程控制块类似,包含了描述线程属性的信息,如线程ID、线程的栈指针、程序计数器、条件码和通用寄存器的值等,以及线程的执行状态(运行、就绪等)

线程执行栈:保存一个线程执行过程中的活动记录,包括用户栈和内核栈。其中用户栈用于保存过程调用的活动记录,内核栈用于保存系统调用的活动记录。执行栈对于每个线程来说都是私有的,因此不同线程的执行流不会发生相互干扰

线程局部存储(TLS,Thread Local Storage):是某些操作系统为线程单独提供的私有空间,用于存储每个线程私有的全局变量,即一个线程内部的各个过程调用都能访问、但其他线程不能访问的变量

1.3 进程之中创建线程的优点

在一个进程之中创建线程的优点:

a) 在一个已有的进程之中创建一个线程比创建一个新的进程所需的开销时间要少许多、Mach开发者的研究表明、创建一个线程比创建一个进程快10倍。

b) 终止一个线程比终止一个进程所花费的时间要少

c) 同一个进程内线程之间的切换所花费的时间要比进程之间切换所花费的时间要少

d) 线程提高了程序之间的通信效率、在大多数的操作系统中、独立的进程之间的通信需要内核的介入、但是同一个进程之中的线程共享内存和文件、同一个进程之中的线程之间的通信不需要内核的介入

1.4 进程和线程的区别

线程是处理器调度的最小单位,但是进程时操作系统资源分配的最小单位

a) 地址空间:
线程共享本进程的地址空间,而进程之间是独立的地址空间

b) 资源:
线程共享本进程的资源如内存、I/O、cpu等,不利于资源的管理和保护,而进程之间的资源是独立的,能很好的进行资源管理和保护

c) 健壮性:
多进程要比多线程健壮,一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉

d) 执行过程:
每个独立的进程有一个程序运行的入口、顺序执行序列和程序入口,执行开销大
线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制,执行开销小

e) 可并发性:
两者均可并发执行

f) 切换时:
进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程



1.5 举个非常直观的例子感受多线程的作用

“吃鸡”问题:

(1)先使用多进程的方式

  

(2)再使用单进程,多线程的方式

 

(3)线程是越多越好的嘛?应该有多少比较合适?

(4)多线程有安全问题 

 

这篇关于Java多线程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!