进程与线程杂记

来源:互联网 发布:淘宝云客服报名 编辑:程序博客网 时间:2024/06/06 14:05

定义:
进程和线程都是由操作系统所体现的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。 
进程和线程的区别在于:
简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
线程的划分尺度小于进程,使得多线程程序的并发性高。
另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出 口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.
一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行.

线程的生命周期
1.新建状态 (new) : 
      新创建了一个线程对象,建立线程的方式有两种:
            

1,通过继承Thread类,创建一个Thread类的子类XXXThread,通过直接new Thread()的方式创建线程对象.


2,通过实现Runnble接口的方式创建可运行的类XXXRunnable,创建一个Thread类的对象XXXRunnable对象作为参数传入到new Threa()的构造方法


简便方法 : 


2.就绪状态(Runnable/ready) : 
      线程对象创建后,其它线程调用了该对象的start()方法.
该状态的线程位于可裕兴线程池中,变的可运行,等待获取CPU的使用权.
 
3.运行状态(Runnable/Running):
      就绪状态的线程获取了CPU执行程序代码.
runnable = ready and running

线程是抢占式运行谁抢到了cpu的执行权,谁就执行


4.阻塞状态(blocked):
      阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行.
直到线程进入就绪状态,才有机会转到运行状态.
阻塞的情况分三种:
(一)    等待阻塞
运行的线程执行wait()方法,JVM会把该线程放入等待池中

JNIjava native interface
 java 本地 接口

sleep与wait的区别
sleep和wait都会使当前对象进入阻塞状态,不同的是 sleep 对象不会释放锁对象而 wait 会释放锁对象

(二)    同步阻塞
运行的线程再获取对象的同步锁时,若该同步锁被别的线程占用,则
JVM会把该线程放入等待池中
* 是什么?* 锁是一个对象
* 假设有ABCD四个线程 同时访问一个方法del* 如果A线程先访问这个del方法* 那么锁对象就会被A线程持有* 其他线程(B,C,D)想访问del方法的时候,* 会发现锁对象被A线程拿走了,* 那么(B,C,D)就都不能进入到del方法中* 当A线程执行完毕del方法,会将锁对象释放出来* 这时候(B,C,D)线程再争夺执行权,* 谁抢到了,谁来执行del方法* 谁执行del方法,那么谁就又先行拿到了锁对象* 这时候剩下的两个线程就又进不来del方法中了
* synchronized,表示同步的意思** 同步可以理解成等待某一事件结束才能开始做下一件事情* 异步是两个事件可以同时进行.一个事件不需要等待另一个事件完成以后就可以开始做** 同步是阻塞的,就是你做了这件事情没做完就做不了别的事情了* 异步就是做了一件事情没做完,就可以去做别的事情了
* 使用synchronized关键字的两种方式:* 1,在方法的声明上,使用synchronized关键字修饰* 2,使用synchronized代码块将要执行的代码包起来


(三)    其它阻塞
运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM
会把该线程置为阻塞状态.当sleep()状态超时,join()等待线程终止
或者超时,或者I/O处理完毕时,线程重新转入就绪状态.

join方法* t1.join()* 等待t1执行完,其它线程再执行* t1.join(500)* 等待t1执行500毫秒后,其它线程再执行

sleep()和yield()的区别:sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会被执行;yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

5.死亡状态(dead):
线程执行完了或者因异常退出了run()方法,该线程结束生命周期


.


原创粉丝点击