java基础知识(多线程篇)

来源:互联网 发布:淘宝网络兼职平台is 编辑:程序博客网 时间:2024/06/07 05:30

1、sleep、join、yield区别;notify、notifAll、wait用法

(A)sleep、join、yield区别

sleep和yield都是Thread的静态方法,都使当前处于运行状态的线程放弃CPU,把运行机会让给别的线程。二者区别主要在于:
(1)sleep会给其他线程运行机会,并且不考虑其他线程的优先级,因此也会给优先级线程低的线程运行机会;yield方法只给相同优先级或者更高优先级线程一个运行的机会;
(2)线程执行了sleep(long millis)之后,将转为阻塞状态,参数millis是指定睡眠时间;线程执行了yield()方法后,将转为就绪状态。

(3)sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出异常。

(4)sleep()方法比yield()有更好的可移植性。不能依靠yield()方法来提高程序的并发性能。yield()一般用于测试期间认为提高程序并发性能,以发现隐藏的错误。


join():当前运行的线程调用另一个线程的join()方法后,当前线程将转入阻塞状态,直至另一个线程运行结束。

jion()方法有两种重载形式:public void join()和public void join(long timeout)

timeout参数表示设定当前线程被阻塞的时间(毫秒数)。当线程被阻塞时间超过了timeout或者当前线程运行结束时,调用join(timeout)的线程将恢复运行。

(B)notify、notifAll、wait用法

wait()和notify方法提供了线程间通信的方法。

wait():执行该方法的线程释放对象的锁,java虚拟机把该线程放到该对象的等待池中。该线程等待其他线程将他唤醒。

notify():执行该方法的线程唤醒在对象的等待池中等待的一个线程。java虚拟机从对象的等待池中随机选择一个线程,把他转到对象的锁池中

notifyAll():该方法把对象的等待池中的所有线程都转到对象的锁池中。


2. 线程的生命周期 
新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 

就绪状态:当一个线程创建了以后,其他的线程调用了它的start()方法,该线程就进入了就绪状态。处于这个状态的线程位于可运行池中,等待获得CPU的使用权 

运行状态:处于这个状态的线程占用CPU,执行程序的代码 

阻塞状态:当线程处于阻塞状态时,java虚拟机不会给线程分配CPU,直到线程重新进入就绪状态,它才有机会转到运行状态。 

阻塞状态分为三种情况: 
2.1、 位于对象等待池中的阻塞状态:当线程运行时,如果执行了某个对象的wait()方法,java虚拟机就回把线程放到这个对象的等待池中 
2.2、 位于对象锁中的阻塞状态,当线程处于运行状态时,试图获得某个对象的同步锁时,如果该对象的同步锁已经被其他的线程占用,JVM就会把这个线程放到这个对象的琐池中。 
2.3、 其它的阻塞状态:当前线程执行了sleep()方法,或者调用了其它线程的join()方法,或者发出了I/O请求时,就会进入这个状态中。 
当一个线程执行System.out.println()或者System.in.read()方法时,会发出一个IO请求,该线程放弃CPU,进入阻塞状态,直到IO处理完毕,该线程才恢复运行。
wait()和sleep的区别 
sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 



死亡状态:当线程运行结束或者异常结束。 Thread类的isAlive()方法可判断一个线程是否还活着(线程处于新建或者死亡状态时,返回false)

以下是状态转换图:



除了通过上述的sleep()等方法调度外,还可以设置线程的优先级。优先级用整数表示,取值范围1——10.Thread有3个静态常量:

MAX_PRIORITY:10,最高

MIN_PRIORITY:1,最低

NORM_PRIORITY:5,默认。

尽管java提供10中优先级,但他与多数操作系统不能很好的映射。Windows 2000有7个优先级,Solaris有2^31个优先级。所以为了保证程序可移植性,确保设置线程优先级时,只使用3个静态常量的优先级。



进程线程的区别

一个程序至少有一个进程,一个进程至少有一个线程。一个线程只能属于一个进程。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.


线程是进程的一个实体,CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。(比如,进程拥有独立的内存空间、地址空间,线程共享其所属进程的内存空间和地址空间)





原创粉丝点击