`
macheng365
  • 浏览: 28036 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

notify和wait举例,俩线程交替累加统一个变量到10

阅读更多

(1)线程1开始执行加1,然后wait一毫秒
(2)这一毫秒里面线程2执行一次,然后wait住
(3)线程1等待一毫秒后自动获取资源的锁,然后唤醒线程2进入就绪状态
(4)线程1还没有释放锁,所以继续循环一次,然后wait一毫秒
(5)这时候线程2可以运行一次并wait
然后重复(3-5)最后直到退出循环。

package com.thread;
public class TwoThread
{
    public static void main(String[] args)
    {
        Counter c = new Counter();
        new Thread(new ThreadOne(c),"线程1").start();
        new Thread(new ThreadTwo(c),"线程2").start();
    }
}


class ThreadOne implements Runnable
{

    Counter c;

    public ThreadOne(Counter c)
    {
        this.c = c;
    }

    /**
     * 
     */
    public void run()
    {
        synchronized (c)
        {
            while (c.value < 10)
            {
                c.value++;
                System.out.println(Thread.currentThread().getName() + "将value加1,value = "
                    + c.value);
                try
                {
                    c.wait(1);//释放对c的同步锁一毫秒,这样线程2就有机会可以执行了(线程2执行后就wait住了)
                    c.notify();//在一毫秒过后线程1自动获取锁后开始执行,唤醒线程2 ,但不是立即线程2就可以执行,而是等线程一在下一次wait(1):释放同步锁后才开始
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }
}


class ThreadTwo implements Runnable
{

    Counter c;


    public ThreadTwo(Counter c)
    {
        this.c = c;
    }


    /**
     * 
     */
    public void run()
    {
        synchronized (c)
        {
            while (c.value < 10)
            {
                c.value++;
                System.out.println(Thread.currentThread().getName() + "将value加1,value = "
                    + c.value);
                try
                {
                    c.wait();
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
            }
        }
    }

}


class Counter
{
    int value;
    /**
     * @return value
     */
    public int getValue()
    {
        return this.value;
    }
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics