java多线程的操做

上篇博客简单了介绍了Java的多线程的概念,与进程的区别,两种建立方式,状态及获取线程名称等内容。这篇文章接着介绍Java的多线程。主要从一下几方面介绍。java

1 线程类的经常使用方法

1.1 start()

启动线程执行run方法编程

1.2 Thread.sleep()/sleep(long millis)

当前线程睡眠/millis的时间(millis指定睡眠时间是其最小的不执行时间,由于sleep(millis)休眠到达后,没法保证会被JVM当即调度);多线程

sleep()是一个静态方法(static method) ,因此他不会中止其余的线程也处于休眠状态;线程sleep()时不会失去拥有的对象锁。spa

做用:保持对象锁,让出CPU,调用目的是不让当前线程独自霸占该进程所获取的CPU资源,以留必定的时间给其余线程执行的机会。.net

1.3 Thread.yield()

让出CPU的使用权,给其余线程执行机会、让同等优先权的线程运行(但并不保证当前线程会被JVM再次调度、使该线程从新进入Running状态),若是没有同等优先权的线程,那么yield()方法将不会起做用。线程

1.4  Thread.join()

 强制执行该线程,该线程执行期间,其余线程没法运行,必须等该线程执行完毕后,才能执行其余线程。对象

1.5  object.wait()

使线程进入到等待池(Waiting Pool)中,同时失去了对象的机锁---暂时的,wait后还要返还对象锁。当前线程必须拥有当前对象的锁,若是当前线程不是此锁的拥有者,会抛出IllegalMonitorStateException异常,因此wait()必须在synchronized block中调用。blog

1.6 Object.notify()/notifyAll()

 唤醒在当前对象等待池中等待的第一个线程/全部线程。notify()/notifyAll()也必须拥有相同对象锁,不然也会抛出IllegalMonitorStateException异常。进程

1.7Object.wait()和Thread.sleep(long)的区别

1.sleep()方法资源

sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留必定时间给其余线程执行的机会。
sleep()是Thread类的Static(静态)的方法;所以他不能改变对象的机锁,因此当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,可是对象的机锁并木有被释放,其余线程没法访问这个对象(即便睡着也持有对象锁)。
在sleep()休眠时间期满后,该线程不必定会当即执行,这是由于其它线程可能正在运行并且没有被调度为放弃执行,除非此线程具备更高的优先级。

2. wait()方法
wait()方法是Object类里的方法;当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去(释放)了对象的机锁(暂时失去机锁,wait(long timeout)超时时间到后还须要返还对象锁),其余线程能够访问。
wait()使用notify或者notifyAlll或者指定睡眠时间来唤醒当前等待池中的线程。
wiat()必须放在synchronized block中,不然会在program runtime时扔出"java.lang.IllegalMonitorStateException"异常。
 
总结一下:

sleep()睡眠时,保持对象锁,仍然占有该锁。

wait()睡眠时,释放对象锁。

 

2 线程的终止

3 线程的同步问题

 

 

参考:

 

Java多线程看我这一篇就足够了

java多线程-概念&建立启动&中断&守护线程&优先级&线程状态(多线程编程之一)

Java Thread 总结

相关文章
相关标签/搜索