黑马程序员-多线程
2013-12-21 23:22
302 查看
----------- android培训、java培训、期待与您交流! ------------
线程之间的通信概念
Java是通过object类的wait,notify,notifyAll这几个方法来实现线程之间的通信的。由于所有的类都是从object继承来的,因此在任何类中都可以直接使用这些方法。三个方法方法的简单说明如下:
Wait:告诉当前进程放弃监视器并进入睡眠状态,直到其他进程进入同一监视器并调用notify为止。
Notify:唤醒同一对象监视器中调用wait的第一个线程。
notifyAll:唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行。
Wait,notify,notifyAll这三个方法只能在synchronized方法中调用,即无论线程调用一个对象的wait还是notify方法,该线程必须得到该对象的锁旗标。这样,notify只能唤醒同一对象监视器中调用wait的线程,使用多个对象监视器,我们就可以分组有多个wait,notify的情况,同组里的wait只能被同组的notify唤醒。
线程生命周期包括:创建状态、可运行状态、不可运行状态、消亡状态。
线程状态转换图:
创建状态:当用new操作符创建一个新的线程对象时,该线程处于处于创建状态,此时的线程只是一个空的线程,并未被分配资源。
可运行状态:执行start()方法为线程分配系统资源,安排其运行,并调用线程体——run()方法,此时的线程实际上并没有真正运行。
不可运行状态:发生如下事件时,运行状态的线程转到不可运行状态
调用了sleep()方法
线程调用wait()方法等待特定条件的满足
线程输入或输出阻塞
返回可运行状态:
睡眠状态的线程在指定的时间过去后
如果线程在等待某一条件,另一个对象必须调用notify()和notifyAll()方法通知等待线程条件的改变受输入或输出阻塞的线程,等待输入或输出完成后
消亡状态:run()方法自然执行后,线程自然消亡。
线程生命的控制:
控制线程生命周期的方法有很多种,如:suspend方法,resume方法和stop方法。并不推荐使用这三个方法,因为以下几点:
会导致死锁的发生。
它允许一个线程通过直接控制另外一个线程的代码来直接控制那个线程。
虽然stop方法可以避免死锁,但会带来另外的不足,如果一个线程正在操作共享数据段,操作过程没有完成就stop的话,将会导致数据的不完整性。因此stop方法我们也不提倡使用。在实际的编程操作中我们推荐使用控制run方法中的循环条件的方式来结束一个线程,这也是实际情况中使用最多的。
小练习
卖票小例子
----------- android培训、java培训、期待与您交流! ------------
线程之间的通信概念
Java是通过object类的wait,notify,notifyAll这几个方法来实现线程之间的通信的。由于所有的类都是从object继承来的,因此在任何类中都可以直接使用这些方法。三个方法方法的简单说明如下:
Wait:告诉当前进程放弃监视器并进入睡眠状态,直到其他进程进入同一监视器并调用notify为止。
Notify:唤醒同一对象监视器中调用wait的第一个线程。
notifyAll:唤醒同一对象监视器中调用wait的所有线程,具有最高优先级的线程首先被唤醒并执行。
Wait,notify,notifyAll这三个方法只能在synchronized方法中调用,即无论线程调用一个对象的wait还是notify方法,该线程必须得到该对象的锁旗标。这样,notify只能唤醒同一对象监视器中调用wait的线程,使用多个对象监视器,我们就可以分组有多个wait,notify的情况,同组里的wait只能被同组的notify唤醒。
线程生命周期包括:创建状态、可运行状态、不可运行状态、消亡状态。
线程状态转换图:
创建状态:当用new操作符创建一个新的线程对象时,该线程处于处于创建状态,此时的线程只是一个空的线程,并未被分配资源。
可运行状态:执行start()方法为线程分配系统资源,安排其运行,并调用线程体——run()方法,此时的线程实际上并没有真正运行。
不可运行状态:发生如下事件时,运行状态的线程转到不可运行状态
调用了sleep()方法
线程调用wait()方法等待特定条件的满足
线程输入或输出阻塞
返回可运行状态:
睡眠状态的线程在指定的时间过去后
如果线程在等待某一条件,另一个对象必须调用notify()和notifyAll()方法通知等待线程条件的改变受输入或输出阻塞的线程,等待输入或输出完成后
消亡状态:run()方法自然执行后,线程自然消亡。
线程生命的控制:
控制线程生命周期的方法有很多种,如:suspend方法,resume方法和stop方法。并不推荐使用这三个方法,因为以下几点:
会导致死锁的发生。
它允许一个线程通过直接控制另外一个线程的代码来直接控制那个线程。
虽然stop方法可以避免死锁,但会带来另外的不足,如果一个线程正在操作共享数据段,操作过程没有完成就stop的话,将会导致数据的不完整性。因此stop方法我们也不提倡使用。在实际的编程操作中我们推荐使用控制run方法中的循环条件的方式来结束一个线程,这也是实际情况中使用最多的。
小练习
/* 练习。 创建两个线程。和主线程交替运行。 */ class Test extends Thread { private String name; Test(String name){ this.name = name; } public void run(){ for(int x = 0 ; x<60;x++){ System.out.println(name +" run...."+x); } } } class ThreadTest { public static void main(Stirng[] args){ Test t1 = new Test("one"); Test t2 = new Test(""two); t1.start(); t2.start(); for(int x = 0; x<60;x++){ System.out.println("main...."+x); } } }
卖票小例子
/* 需求:简单的卖票程序 多个窗口同事卖票 */ class Ticket extends Thread { private int tick = 100; public void run(){ while(true){ if(tick>0){ System.out.println(currentThread().getName()+"sale :"+tick--); } } } } class TicketDemo { public static void main(String[] args){ Ticket t1 = new Ticket(); Ticket t2 = new Ticket(); Ticket t3 = new Ticket(); Ticket t4 = new Ticket(); t1.start(); t2.start(); t3.start(); t4.start(); } }
----------- android培训、java培训、期待与您交流! ------------
相关文章推荐
- 黑马程序员-- Java多线程编程总结
- 黑马程序员_多线程
- 黑马程序员---Java多线程(2)
- 黑马程序员 课堂笔记-心得 多线程及同步锁
- 黑马程序员:多线程
- 黑马程序员_【总结】_多线程知识梳理1
- 黑马程序员之多线程
- 黑马程序员_多线程:生产者消费者练习实例及问题
- 黑马程序员--多线程
- 【黑马程序员】多线程
- 黑马程序员——多线程(二)
- 黑马程序员——第11天——多线程(1/2)
- 黑马程序员 多线程(一)。
- 黑马程序员——多线程、String类和基本数据类型包装类
- 黑马程序员——多线程
- 黑马程序员---Java基础---多线程
- 黑马程序员——多线程
- 黑马程序员_多线程初步学习
- 黑马程序员——Java多线程—线程互斥—Lock
- 黑马程序员 JAVA多线程实现的三种方式