在线程切换的时候不涉及CPU寄存器的保存以及进程状态的保护。
线程实现整个环境的异步模式,但有时需要同步(两个线程同时读写同一数据)。
线程通过sleep或者yeild主动放弃CPU的占用。
Run()方法几乎肯定含有某种形式的循环——它们会一直持续到线程不再需要为止。因此,为了中断并退出这个循环,必须规定特定的条件。否则,除非外部发出对线程的stop或者destroy调用,它会永远运行下去,直到程序结束。
堵塞(挂起)状态Blocked可能是由下列五方面的原因造成:
1, 调用sleep(),使线程进入睡眠状态;
2, 用ruspend()暂停了线程的执行。除非线程收到resume()消息,否则不会返回可运行状态;
3, 用wait()暂停了线程执行,除非线程收到nofify()或者notifyAll();
4, 线程正在等候一些IO(输入输出)操作完成。
5, 线程试图调用另一个对象的“同步”方法,但哪个对象处于锁定状态,暂时无法使用。
Java没有监视器这个类,Java提供的解决方法是为每一个对象都有其独立的监视器,当一个线程进入一个具有同步特性的函数(sychronized)时,其余线程将不操作同一个对象的同步函数,换句话说,同步机制已经融合进了Java语言当中。
无论sleep还是suspend都不会在自己被调用的时候解除缩定,必须等到时间到了或调用了自己的resume()方法。
Wait()在挂起内部调用的方法时,会解释对象的锁定,并且能够自由的退出wait(),因为一个notity()可强行使时间流逝(当wait有参数时)。
Wait()和notify()同属Object()类,而sleep,suspend以及resume同属Thread类。因此,专门进行线程处理的东西也就成为通用基础类(Object)的一部分。因此,我们可将一个wait()置入任何同步方法内部,无论在哪个类里是否进行涉及线程的处理。
线程池:
池化资源:在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多的资源,在Java中更是如此,虚拟机将试图跟踪没一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象的创建与销毁。
一般一个线程池至少包含下列组成部分。
线程管理器(ThreadPoolManager):用于创建线程池,销毁线程池,添加新任务。
工作线程(WorkThread):线程池中线程。
任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行。它规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等。
任务队列:用于存放没有处理的任务。提供一种缓冲机制。
守护线程:myThread.setDaemon(true);
守护线程是一个后台运行的线程,从属于生成它的线程,所以当生成守护线程的线程结束时,此守护线程会随之消失。相对与守护线程的是用户线程,它有自己的生命周期,不依赖创建它的线程,它可以在创建它的线程结束后继续执行。