Core Java基础知识之一(线程私房菜)

Java的高明之处就是在于不断的总结实际应用中不断出现的通用问题,为此提供此类问题的底层实现,向调用者提供解决问题的接口实现,调用者大可不必完全的明白底层的实现原理和实现过程,只要照葫芦画瓢,往往问题就可以迎刃而解。但是对于一个专业人员来说,掌握这些暴漏的接口固然很是重要,学会使用的同时,还要知其然,知其所以然。

线程也是java种引进的一个很重要的应用。为此研究一下线程的一些知识,共大家参考。

线程的概念

  • 线程的生命周期

             程序中单独顺序的流控制,本身不能运行,只能用在程序中。

        单线程的概念没有什么新的地方,真正有趣的是在一个程序中同时使用多个线程来完成不同的任务。某些地方用轻量进程            (Lightweight  Process)来代替线程,线程与真正进程的相似性在于它们都是单一顺序控制流。然而线程被认为轻量是由于         它运行于整个程序的上 下 文内,能使用整个程序共有的资源和程序环境。

  • 线程的实现 

  • 线程的优先级

  • 线程的同步
  • 线程组






Core Java基础知识之一(线程私房菜)

1.       程序通过Thread t = new Thread(),调用t.start()启动一个线程,使该线程进入可运行(Runnable)的状态。

2.       JVM的决定去调度(Scheduler) 在可运行状态(Runnable)下的线程,使该线程处于运行 (Running) 状态,由于JVM的调度会出现不可控性,即不是优先级高的先被调用,可能先调用,也可能后调用的的情况。运行状态(Running)下,调用礼让yield()方法,可以使线程回到可运行状态(Runnable)下,再次JVM的调度(并不依赖优先级)。

3.       线程在Running的过程中可能会遇到阻塞(Blocked)情况

①.调用join()sleep()方法,sleep()时间结束或被打断,join()中断,IO完成都会回到Runnable状态,等待JVM的调度。

②.调用wait(),使该线程处于等待池(wait blocked pool),直到notify()/notifyAll(),线程被唤醒被放到锁池(lock blocked pool ),释放同步锁使线程回到可运行状态(Runnable

③.Running状态的线程加同步锁(Synchronized)使其进入(lock blocked pool ),同步锁被释放进入可运行状态(Runnable)

4.       线程run()运行结束或异常退出,线程到达死亡状态(Dead)

sleepwait的区别有:
1
:这两个方法来自不同的类分别是ThreadObject
2
:最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
3
waitnotifynotifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
    
任何地方使用
   synchronized(x){
x.notify()
//
或者wait()
}

4sleep必须捕获异常,而waitnotifynotifyAll不需要捕获异常

5:其实两者都可以让线程暂停一段时间,但是本质的区别是一个线程的运行状态控制,一个是线程之间的通讯的问题

notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。

notifyAll():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争

你可能感兴趣的:(Core Java基础知识之一(线程私房菜))