线程的【生命周期】和【线程的同步】(多窗口售票例子)

 

 JDK 中用Thread.State 类定义了线程的几种状态
要想实现多线程,必须在主线程中建立新的线程对象。Java语言使用Thread类
及其子类的对象来表示线程,在它的一个完整的生命周期中一般要经历以下的 五
种状态:安全


新建: 当一个Thread类或其子类的对象被声明并建立时,新生的线程对象处于新建
状态多线程


就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它已
具有了运行的条件,只是没分配到CPU资源ide


运行:当就绪的线程被调度并得到CPU资源时,便进入运行状态, run()方法定义了线
程的操做和功能this


阻塞:在某种特殊状况下,被人为挂起或执行输入输出操做时,让出 CPU 并临时中
止本身的执行,进入阻塞状态spa


死亡:线程完成了它的所有工做或线程被提早强制性地停止或出现异常致使结束线程

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

解决方法:code

/**
* 例子:建立三个窗口卖票,总票数为100张.使用实现Runnable接口的方式
*
* 1.问题:卖票过程当中,出现了重票、错票 -->出现了线程的安全问题
* 2.问题出现的缘由:当某个线程操做车票的过程当中,还没有操做完成时,其余线程参与进来,也操做车票。
* 3.如何解决:当一个线程a在操做ticket的时候,其余线程不能参与进来。直到线程a操做完ticket时,其余
* 线程才能够开始操做ticket。这种状况即便线程a出现了阻塞,也不能被改变。
*
*
* 4.在Java中,咱们经过同步机制,来解决线程的安全问题。
*
* 方式一:同步代码块
*
* synchronized(同步监视器){
* //须要被同步的代码
*
* }
* 说明:1.操做共享数据的代码,即为须要被同步的代码。 -->不能包含代码多了,也不能包含代码少了。
* 2.共享数据:多个线程共同操做的变量。好比:ticket就是共享数据。
* 3.同步监视器,俗称:锁。任何一个类的对象,均可以充当锁。
* 要求:多个线程必需要共用同一把锁。
*
* 补充:在实现Runnable接口建立多线程的方式中,咱们能够考虑使用this充当同步监视器。
* 方式二:同步方法。
* 若是操做共享数据的代码完整的声明在一个方法中,咱们不妨将此方法声明同步的。
*
*
* 5.同步的方式,解决了线程的安全问题。---好处
* 操做同步代码时,只能有一个线程参与,其余线程等待。至关因而一个单线程的过程,效率低。 ---局限性
*
* @author ch
* @create 2019-02-13 下午 4:47
*/
class Window1 implements Runnable{

    private int ticket = 100;
//    Object obj = new Object();
//    Dog dog = new Dog();
    @Override
    public void run() {
//        Object obj = new Object();
        while(true){
            synchronized (this){//此时的this:惟一的Window1的对象   //方式二:synchronized (dog) {

                if (ticket > 0) {

                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + ticket);


                    ticket--;
                } else {
                    break;
                }
            }
        }
    }
}


public class WindowTest1 {
    public static void main(String[] args) {
        Window1 w = new Window1();

        Thread t1 = new Thread(w);
        Thread t2 = new Thread(w);
        Thread t3 = new Thread(w);

        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");

        t1.start();
        t2.start();
        t3.start();
    }

}
相关文章
相关标签/搜索