第二天:线程与进程

什么是线程什么是进程

进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。
线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。
操作系统在分配资源时是把资源分配给进程的,但是 CPU资源比较特殊,它是被分配到线程的,因为真正要占用 CPU运行的是线程,所以也说线程是 CPU分配的基本单位。

进程和线程的关系

线程创建的方式

在这里插入图片描述

线程常用的调度方法

在这里插入图片描述
在 Object类中有一些函数可以用于线程的等待与通知。
wait():当一个线程 A调用一个共享变量的 wait()方法时,线程 A会被阻塞挂起,发生下面几种情况才会返回:(1)线程 A调用了共享对象 notify()或者 notifyAll()方法;(2)其他线程调用了线程 A的 interrupt()方法,线程 A抛出InterruptedException异常返回。
wait(long timeout):这个方法相比 wait()方法多了一个超时参数,它的不同之处在于,如果线程 A调用共享对象的 wait(long timeout)方法后,没有在指定的 timeout ms时间内被其它线程唤醒,那么这个方法还是会因为超时而返回。
wait(long timeout, int nanos),其内部调用的是 wait(long timout)函数。

唤醒线程的方法
notify() :一个线程 A调用共享对象的 notify()方法后,会唤醒一个在这个共享变量上调用 wait系列方法后被挂起的线程。一个共享变量上可能会有多个线程在等待,具体唤醒哪个等待的线程是随机的。notifyAll():不同于在共享变量上调用 notify()函数会唤醒被阻塞到该共享变量上的一个线程,notifyAll()方法则会唤醒所有在该共享变量上由于调用 wait系列方法而被挂起的线程。

Thread类等待方法
join():如果一个线程 A执行了 thread.join()语句,其含义是:当前线程A等待 thread线程终止之后才从 thread.join()返回。

线程休眠方法
sleep(long millis) :Thread类中的静态方法,当一个执行中的线程 A调用了 Thread的 sleep方法后,线程 A会暂时让出指定时间的执行权,但是线程 A所拥有的监视器资源,比如锁还是持有不让出的。指定的睡眠时间到了后该函数会正常返回,接着参与 CPU的调度,获取到 CPU资源后就可以继续运行。

让出优先权
yield():Thread类中的静态方法,当一个线程调用 yield方法时,实际就是在暗示线程调度器当前线程请求让出自己的 CPU,但是线程调度器可以无条件忽略这个暗示。

线程状态

在这里插入图片描述

在这里插入图片描述

什么是线程上下文切换

为了让用户感觉多个线程是在同时执行的, CPU资源的分配采用了时间片轮转也就是给每个线程分配一个时间片,线程在时间片内占用 CPU执行任务。当线程使用完时间片后,就会处于就绪状态并让出 CPU让其他线程占用,这就是上下文切换。
在这里插入图片描述

什么是守护线程

Java中的线程分为两类,分别为 daemon线程(守护线程)和 user线程(用户线程)。
在 JVM启动时会调用 main函数,main函数所在的钱程就是一个用户线程。其实在 JVM内部同时还启动了很多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别呢?区别之一是当最后一个非守护线程束时, JVM会正常退出,而不管当前是否存在守护线程,也就是说守护线程是否结束并不影响 JVM退出。换而言之,只要有一个用户线程还没结束,正常情况下 JVM就不会退出。

线程间如何通信

在这里插入图片描述

volatile和 synchronized关键字

volatile可以用来修饰字段(成员变量),就是告知程序任何对该变量的访问均需要从共享内存中获取,而对它的改变必须同步刷新回共享内存,它能保证所有线程对变量访问的可见性。关键字 synchronized可以修饰方法或者以同步块的形式来进行使用,它主要确保多个线程在同一个时刻,只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性。

等待/通知机制

可以通过 Java内置的等待/通知机制(wait()/notify())实现一个线程修改一个对象的值,而另一个线程感知到了变化,然后进行相应的操作。

管道输入/输出流

管道输入/输出流和普通的文件输入/输出流或者网络输入/输出流不同之处在于,它主要用于线程之间的数据传输,而传输的媒介为内存。管道输入/输出流主要包括了如下 4种具体实现:PipedOutputStream、PipedInputStream、 PipedReader和 PipedWriter,前两种面向字节,而后两种面向字符。

使用 ThreadLocal

ThreadLocal,即线程变量,是一个以 ThreadLocal对象为键、任意对象为值的存储结构。这个结构被附带在线程上,也就是说一个线程可以根据一个 ThreadLocal对象查询到绑定在这个线程上的一个值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值