进程与线程以及其状态

1、进程:

进程是指程序的一次执行,它占有一片独有的内存空间,可以通过window中,任务管理器查看。进程是操作系统分配的占有CPU资源的最小单位。

进程是cpu资源分配的最小单位(是能拥有资源和独立运行的最小单位)

2、线程:

线程是指CPU的基本调度单位,是程序执行的一个完整流程,是进程内的一个独立执行单元。同一个进程下所有线程,共享进程的地址空间。

线程是cpu调度的最小单位(线程是建立在进程的基础上的一次程序运行单位,一个进程中可以有多个线程)

3、进程与线程关系:

  • 应用程序必须运行在某个进程的某个线程上
  • 一个进程中至少有一个运行的线程:主线程,进程启动后自动创建
  •  一个进程中如果同时运行多个线程,那这个程序是多线程运行的
  • 一个进程的内存空间是共享的,每个线程都可以使用这个共享内存
  •  多个进程之间的数据是不能直接共享的

4、关系、通性

关系:进程中包含着至少一个进程。进程创建之初,会自动创建一个线程-主线程,主线程会根据需要,调用系统库函数去创建其他线程。线程之间没有层级关系,它们之间协同完成工作。在进程完成工作之后,线程会被销毁,释放资源。

通性: 都包含了三个状态:【就绪】、【阻塞】、【运行】。

【阻塞】:资源未到位,等待资源中

【就绪】:资源到位了,但是CPU未到位,还在运行其他

【运行】:CPU到位了运行状态

5、进程与线程的状态

进程的五种状态

1、新建状态(New)

当用new()方法创建一个线程时,如new Thread(r),线程还没有开始运行,此时线程处于新建立状态。当一个线程处于新生状态时,程序还没有开始运行线程种的代码。

2、就绪状态(Runnable)

一个新创建的线程并不自动开始运行,要执行线程,必须调用线程的start()方法。当线程对象调用start()方法即启动了线程,start()方法创建线程运行的系统资源,并调度线程运行run()方法。 当start()方法返回后,线程就处于就绪状态。

注意:  

处于就绪状态的线程并不一定立即运行run()方法,线程还必须同其他线程竞争CPU时间,只有获得CPU时间才可以运行线程。

 因为在单个CPU的计算机系统中,不可能同时运行多个线程,一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。  

对于多个处于就绪状态的线程是由java运行时系统的线程调度 > 程序(thread scheduler)来调度的。

3、运行状态(Running)

当线程获得CPU时间后,它才进入运行状态,真正开始执行run()方法

4、阻塞状态(Blocked)

线程运行过程中,可能由于各种原因进入阻塞状态;

  • 线程通过调用sleep()方法进入睡眠状态
  •  线程调用一个在I/O上被阻塞的操作,即改操作在输入输出操作完成之前不会返回到它的调用者;
  • 线程试图得到一个所,而该锁正被其他线程持有
  • 线程在等待某个触发条件;

阻塞概念 阻塞状态时正在运行的线程没有运行结束,暂时让出CPU,这时其他处于就绪状态的线程就可以获得CPU时间,进入运行状态。

分三种阻塞:

  • 等待阻塞:运行状态中的线程执行wait()方法,使线程进入到等待阻塞状态
  • 同步阻塞:线程在获取synchronized同步锁失败(因为同步锁被其他线程占用)
  • 其他阻塞:通过调用线程的sleep()或join()发出了I/O请求时线程就会进入到阻塞状态。当sleep()状态超时,join()等待线程终止或超时,或者I/O处理完毕,线程重新转入就绪状态。

5、死亡状态(Dead)

导致线程死亡两个:

1) run()方法正常退出而自然死亡 2) 一个未捕获的异常终止了run方法而使线程猝死。

为了确定线程在当前是否存活着(就是要么是可运行的,要么是被阻塞了),需要使用isAlive方法。如果是可运行或被阻塞,这个方法返回true; 如果线程仍旧是new状态且不是可运行的, 或者线程死亡了,则返回false.

发表评论

电子邮件地址不会被公开。 必填项已用*标注