子线程循环10次,主线程循环100次,如此循环100次

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

/**
 * 一、使用wait、notify
 * 子线程循环10次,主线程循环100次,如此循环100次。
 */
public class SubMainThreadDemo
{
    public static void main(String[] args)
    {
        final Business business = new Business();
        new Thread(new Runnable()
        {
            public void run()
            {
                for(int i=0;i<100;i++)
                {
                    business.sub(i);
                }
            }
        }).start();
        for(int i=0;i<100;i++)
        {
            business.main(i);
        }
    }
}

class Business
{
    private boolean flag = true;
    public synchronized void sub(int i)
    {
        while(!flag)
        {
            try
            {
                this.wait();
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        for(int j=0;j<10;j++)
        {
            System.out.println("sub thread "+j);
        }
        flag = false;
        this.notify();
    }
    public synchronized void main(int i)
    {
        while(flag)
        {
            try
            {
                this.wait();
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }
        }
        for(int j=0;j<100;j++)
        {
            System.out.println("main thread "+j);
        }
        flag = true;
        this.notify();
    }
}
package thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 二、使用Condition线程通信
 * 子线程循环10次,主线程循环100次,如此循环100次。
 */
public class ConditionDemo
{
    public static void main(String[] args)
    {
        final Business business = new Business();
        new Thread(new Runnable()
        {
            public void run()
            {
                for (int i = 0; i < 100; i++)
                {
                    business.sub(i);
                }
            }
        }).start();
        for (int i = 0; i < 100; i++)
        {
            business.main(i);
        }
    }

    static class Business
    {
        private boolean flag = true;
        Lock lock = new ReentrantLock();
        Condition condition = lock.newCondition();
        public void sub(int i)
        {
            lock.lock();
            try
            {
                while (!flag)
                {
                    try
                    {
                        condition.await();
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
                for (int j = 0; j < 10; j++)
                {
                    System.out.println("sub thread " + j);
                }
                flag = false;
                condition.signal();
            }
            finally
            {
                lock.unlock();
            }
        }

        public void main(int i)
        {
            lock.lock();
            try
            {
                while (flag)
                {
                    try
                    {
                        condition.await();
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                    }
                }
                for (int j = 0; j < 100; j++)
                {
                    System.out.println("main thread " + j);
                }
                flag = true;
                condition.signal();
            }
            finally
            {
                lock.unlock();
            }
        }
    }
}

两种方式执行结果相同,结果如下:

sub thread 0
sub thread 1
sub thread 2
sub thread 3
sub thread 4
sub thread 5
sub thread 6
sub thread 7
sub thread 8
sub thread 9
main thread 0
main thread 1
main thread 2
main thread 3
main thread 4
main thread 5
main thread 6
main thread 7
main thread 8
main thread 9
main thread 10
main thread 11
main thread 12
main thread 13
main thread 14
main thread 15
main thread 16
main thread 17
main thread 18
main thread 19
main thread 20
main thread 21
main thread 22
main thread 23
main thread 24
main thread 25
main thread 26
main thread 27
main thread 28
main thread 29
main thread 30
main thread 31
main thread 32
main thread 33
main thread 34
main thread 35
main thread 36
main thread 37
main thread 38
main thread 39
main thread 40
main thread 41
main thread 42
main thread 43
main thread 44
main thread 45
main thread 46
main thread 47
main thread 48
main thread 49
main thread 50
main thread 51
main thread 52
main thread 53
main thread 54
main thread 55
main thread 56
main thread 57
main thread 58
main thread 59
main thread 60
main thread 61
main thread 62
main thread 63
main thread 64
main thread 65
main thread 66
main thread 67
main thread 68
main thread 69
main thread 70
main thread 71
main thread 72
main thread 73
main thread 74
main thread 75
main thread 76
main thread 77
main thread 78
main thread 79
main thread 80
main thread 81
main thread 82
main thread 83
main thread 84
main thread 85
main thread 86
main thread 87
main thread 88
main thread 89
main thread 90
main thread 91
main thread 92
main thread 93
main thread 94
main thread 95
main thread 96
main thread 97
main thread 98
main thread 99
sub thread 0
sub thread 1
sub thread 2
sub thread 3
sub thread 4
sub thread 5
sub thread 6
sub thread 7
sub thread 8
sub thread 9
main thread 0
main thread 1
main thread 2
......

猜你喜欢

转载自blog.csdn.net/qq_35917800/article/details/79552448