java多线程的一些基础知识

版权声明:转载请注明出处 http://blog.csdn.net/yezhongdefeng https://blog.csdn.net/YeZhongDeFeng/article/details/81514776

1、进程与线程,并发与并行

一般来说,运行中的程序称为进程,而一个进程可能有多个执行路径,我们称之为多个线程,线程是CPU调度的最小单位,进程是CPU资源分配的基本单位,各个线程有各自私有的寄存器与栈空间,而同一个进程的多个线程共享进程的堆空间与方法区,如果一个进程需要进行各种计算,比如加法的开一个线程,减法的开一个线程、乘法的再开一个线程,给我们的感觉可能是三个线程在同时执行,实则不然,因为CPU的运行速度很快,快到人无法感知的程度,三个线程之所以看起来是在同时运行,是因为CPU在做着快速切换,切换只在一瞬间,所以我们根本感知不到,这种三个线程同时运行,我们称之为并发,因为三个线程并不是在同时执行,如果在CPU的某些时刻,三个线程真的是同时在运行,那我们称之为并行。一般我们都说,java多线程的并发。

2、线程的生命周期

线程的生命周期与进程的生命周期基本类似,以线程为例,线程的生命周期包括5种状态:开始、可运行、运行中、阻塞、消亡。以代码的角度来说:开始,是指从我们new一个线程后的状态;可运行,是指我们从调用线程的start方法后;运行中,是指可运行状态的线程,恰好被CPU选中,这个时候CPU正在执行此线程;阻塞,是指运行中的某个线程因为某些事件发生而不能正常运行,比如需要用户从键盘上输入数据、调用sleep函数、调用join函数等;消亡,是指线程停止运行,已经死亡,比如run方法结束,线程执行完毕或者发生了某个异常,线程被迫终止。

3、线程常用的几个函数

sleep(参数),可以让线程睡眠,此函数让线程从运行状态转为阻塞状态,到达设定的睡眠参数后,线程将转入可运行状态,继续争夺CPU资源;

join()函数,主要用在以下情况:在主线程中的方法很简单,可能不需要花费什么时间就能走完,但有一点儿是需要输出子线程计算后的数据,而子线程的运行需要耗费大量的时间,这时可以用join函数当子线程执行完毕后,主线程再运行;

yield()函数,停止当前正在运行中的线程,让其进入可运行状态,以期待同其它线程一起争夺CPU资源;

wait()函数,让线程进入一个等待队列,待等待结束后,进入可运行状态,可以通过notify()唤醒;

notify()函数,用于唤醒一些线程,可以唤醒wait,只能用在同步方法中;

sleep与wait的区别,sleep睡眠不会让出CPU资源,wait是进入等待池中,会让出CPU资源;sleep来自Thread类,wait来自Object类,sleep可以用在各种方法中,wait只能用在同步方法中,因为需要释放锁;sleep需要捕获异常,wait不需要。

猜你喜欢

转载自blog.csdn.net/YeZhongDeFeng/article/details/81514776