java两线程交替打印奇偶数

 

方法1:synchronized

class Odd implements Runnable {
        @Override
        public void run() {
            while(idx < len){
                synchronized (lock){
                    if (idx < len && (num[idx] >> 1 << 1) != num[idx]){
                        System.out.print(num[idx]);
                        System.out.println("--Odd");
                        ++idx;
                    }
                }
            }
        }
    }

class Even implements Runnable {
        @Override
        public void run() {
            while(idx < len){
                synchronized (lock){
                    if (idx < len && (num[idx] >> 1 << 1) == num[idx]){
                        System.out.print(num[idx]);
                        System.out.println("--Even");
                        ++idx;
                    }
                }
            }
        }
    }

 

方法2:ReentrantLock

    class Odd implements Runnable {
        @Override
        public void run() {
            while(idx < len){
                rlock.lock();
                if (idx < len && (num[idx] >> 1 << 1) != num[idx]){
                    System.out.print(num[idx]);
                    System.out.println("--Odd");
                    ++idx;
                }
                rlock.unlock();
            }
        }
    }

    class Even implements Runnable {
        @Override
        public void run() {
            while(idx < len){
                rlock.lock();
                if (idx < len && (num[idx] >> 1 << 1) == num[idx]){
                    System.out.print(num[idx]);
                    System.out.println("--Even");
                    ++idx;
                }
                rlock.unlock();
            }
        }
    }

 

对 100000 内自然数 做三次实验耗时:

方法1:1626, 1479, 1420

方法2:1474, 1641, 1524

方法1控制台不打印:25, 23, 24

方法2控制台不打印:213, 211, 211

 

结论:

在当前实验中,synchronized 比 ReentrantLock 性能好

 

完整代码:

 

public class OddEven {
    int len;
    int[] num;
    int idx;
    final Boolean lock = false;
    ReentrantLock rlock = new ReentrantLock();
    CountDownLatch latch;

    public OddEven(int len) {
        this.len = len;
        num = new int[len];
        for (int i = 0; i < len; i++) {
            num[i] = i;
        }
        idx = 0;
    }

    class Odd implements Runnable {
        @Override
        public void run() {
            while(idx < len){
                synchronized (lock){
                    if (idx < len && (num[idx] >> 1 << 1) != num[idx]){
                        System.out.print(num[idx]);
                        System.out.println("--Odd");
                        ++idx;
                    }
                }


//                rlock.lock();
//                if (idx < len && (num[idx] >> 1 << 1) != num[idx]){
//                    System.out.print(num[idx]);
//                    System.out.println("--Odd");
//                    ++idx;
//                }
//                rlock.unlock();

            }

            latch.countDown();
        }
    }

    class Even implements Runnable {
        @Override
        public void run() {
            while(idx < len){
                synchronized (lock){
                    if (idx < len && (num[idx] >> 1 << 1) == num[idx]){
                        System.out.print(num[idx]);
                        System.out.println("--Even");
                        ++idx;
                    }
                }

//                rlock.lock();
//                if (idx < len && (num[idx] >> 1 << 1) == num[idx]){
//                    System.out.print(num[idx]);
//                    System.out.println("--Even");
//                    ++idx;
//                }
//                rlock.unlock();
            }

            latch.countDown();
        }
    }

    public void execute(int threadNum) {
        latch = new CountDownLatch(threadNum);

        long begin = System.currentTimeMillis();

        Thread odd = new Thread(new Odd());
        Thread even = new Thread(new Even());
        odd.start();
        even.start();

        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end = System.currentTimeMillis();
        System.out.println("\ntotal time: " + (end - begin));
    }

    public static void main(String[] args) {
        OddEven oe = new OddEven(100000);
        oe.execute(2);
    }
}

 

posted @ 2020-08-24 13:54  Numerz  阅读(398)  评论(0编辑  收藏  举报