Java多线程(四)- 协调同步线程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_18149897/article/details/72598806

当一个线程使用的同步方法中用到的某个变量,而此变量又需要其他线程修改才能符合本线程的需要,那么可以再同步方法中使用wait()方法。

使用wait()方法时正确的模板是将锁放置在while()循环中。

package test;

public class TicketHome implements Runnable {

    int five_RMB = 2;
    int ten_RMB = 0;
    int twenty_RMB = 0;
    @Override
    public void run() {
        if (Thread.currentThread().getName().equals("Mr.Z")) {
            saleTicket(20);
        }
        else if (Thread.currentThread().getName().equals("Mr.S")) {
            saleTicket(5);
        }

    }
    public synchronized void saleTicket(int money) {
        if (money == 5) {
            five_RMB = five_RMB + 1 ;
            System.out.println("欠货两清,"+Thread.currentThread().getName());
        }
        else if (money == 20) {
            while(five_RMB<3){
                try {
                    System.out.println("太大了,找不开");
                    wait();
                    System.out.println("正好有钱找给你");
                } catch (Exception e) {}
            }
            five_RMB = five_RMB - 3;
            twenty_RMB = twenty_RMB + 1;
            System.out.println("给"+Thread.currentThread().getName()+"入场券,找回15元");
        }
        notifyAll 
        /*notify方法与notifyall方法在数量上不同之外还有什么不同的区别??  
          notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
          notify他只是选择一个wait状态线程进行通知, 并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程们,当第一个线程运行完毕以后释放对象上的锁。
          此时如果该对象没有再次使用notify语句,即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。 

        */
    }
}

注释引用自 [淡然如水的专栏]
http://blog.csdn.net/zhzwsjc1000/article/details/21518819

守护线程的意思是指当程序中的所有用户线程都已结束运行时,即使守护线程中的run()方法中还需要执行的语句,守护线程也立刻结束运行。我们可以使用守护进行进行一些不是很重要的工作。比方说:

Thread.sleep(1000)

线程必须在运行之前设置自己是否是守护线程。

thread.setDaemon(true);

猜你喜欢

转载自blog.csdn.net/qq_18149897/article/details/72598806