多线程 Java

本文详细介绍了Java中的线程和进程,包括内核线程与用户线程的区别、并发与并行的概念、线程的状态转换以及Java线程API的使用。此外,还阐述了程序与进程的差异、线程与进程的特性以及内存管理在Java进程中的作用。

底层实现:

(1)内核线程:Java就是基于内核线程中的轻量级进程实现

系统内核管理线程(KLT),内核保存线程的状态和上下文信息,线程阻塞不会引起进程阻塞。在多处理器系统上,多线程在多处理器上并行运行。线程的创建、调度和管理由内核完成,效率比ULT要慢,比进程操作快。也就是操作系统管理。

(2)用户线程

用户程序实现,不依赖操作系统核心,应用提供创建、同步、调度和管理线程的函数来控制用户线程。不需要用户态/内核态切换,速度快。内核对ULT无感知,线程阻塞则进程(包括它的所有线程)阻塞。也就是说用户程序管理

(3)混合型:综合内核线程+用户线程。

1.程序和进程的区别?

程序:表现为系统中的一个可执行文件(静态的)

进程:程序(静态的可执行文件)运行起来之后,就是一个进程(运行态的程序)

说明:操作系统把程序代码加载到内存,调用CPU执行程序的代码。系统再把进程管理起来,进程时作为系统分配资源的最小单位(CPU,内存等等),一个进程,系统时分配有唯一的一个id标识。

2.并发和并行

并发:在系统调度一个cpu,采用时间轮转调度的方式,在一个时间范围内,执行多个进程的代码。对于人肉眼来说,这个时间时不可感知的,就认为时在同时进行。

并行:多个cpu,在用一个时间点,同时执行多个进程的代码(真同时)。

3.线程和进程的区别?

(1)进程时系统进行资源分配的最小单位,线程是cpu调度的最小单位

(2)进程有自己的内存空间地址,线程只独享指令流执行的必要资源,比如寄存器和栈。

(3)由于同一进程的各线程间共享内存和文件资源,可以不通过内核进行直接通信

(4)线程的创建、切换及终止效率高。

4.内核态和用户态

(1)操作系统 权限最高,如果一个程序执行某个指令,没有权限,就需要调用系统接口来执行,此时,用户进程就进入“内核态”或“核心态”。

(2)用户进程来说,权限是最低的,成为“用户态”。

5.进程的状态

就绪:进程处于可运行的状态,只是CPU时间片还没有轮转到该进程,则该进程处于就绪状态。
运行:进程处于可运行的状态,且CPU时间片轮转到该进程,该进程正在执行代码,则该进程处于运行状态。
阻塞:进程不具备运行条件,正在等待某个事件的完成。
6.Thread 基础API
voidstart()启动线程  当前线程创建态转变为就绪态(java中也可以说可运行态)
static ThreadcurrentThread()返回对当前正在执行的线程对象的引用
static voidyield()线程让步:当前线程由运行态转变为就绪态
static voidsleep(long miuis)线程休眠:让当前线程休眠指定时间以后再继续执行
voidinterrupt()中断这个线程 某个线程的引用.interrupt
booleaninterrupted()中断线程,返回中断标志位;重置标志位
booleanisInterrupted()返回中断标志位
voidjoin()等待这个线程死亡
voidjoin(long millis)等待这个线程死亡最大mills毫秒

创建线程:

创建线程的方式有哪些?(如何定义线程要执行的任务代码?)

只有一种: new Thread

①继承 Thread,重写run

②实现Runnable,重写run

③实现Callable接口,重写call()

启动线程 start vs run:

①.start()  start会真正启动一个线程,和调用start方法所在的线程,是并发并行执行。

② run()run方法只是一个线程的任务定义,如果直接调用run方法,属于普通方法调用。

线程等待  wait()vs  sleep():

wait是要先加锁,再使用;让当前线程等待,并释放对象锁;用于线程通信

7.线程状态和状态转移的意义

线程的状态 :

① New创建态   ② Runnable可运行态   ③ Waiting等待   ④ Timed_Waiting超时等待    ⑤ Blocked阻塞   ⑥ Terminated终止 

8.java进程是如何运行的?java进程的内存和线程的影响

    java类名--->运行一个java进程(系统分配java进程空间),加载class字节码到java进程的内存,java程序(java虚拟机)执行字节码指令(一行一行的翻译为机器码,cpu执行机器码)会启动main线程执行main主函数。

内存(栈 、堆、方法区)

栈(线程私有):包含局部变量表(局部变量+基础数据类型的值)。

堆(线程共享):对象和数组(虽然是共享,但是线程不共用,取决于线程是否能获取对象的引用)。

方法区(线程共享):方法区与java堆一样,是各个线程共享的内存区域。它用于存储已被虚拟机加载的类信息,常量、静态变量,即时编译器编译后的代码等数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值