zoukankan      html  css  js  c++  java
  • 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("
    total time: " + (end - begin));
        }
    
        public static void main(String[] args) {
            OddEven oe = new OddEven(100000);
            oe.execute(2);
        }
    }
  • 相关阅读:
    Spring 事务不回滚
    Druid详细配置信息
    Servlet和JSP规范及版本对应关系
    CDN(内容分发网络)技术原理
    开发者需要了解的WebKit
    浏览器的渲染原理简介
    在浏览器中输入Google.com并且按下回车之后发生了什么?
    为什么说DOM操作很慢
    亿级Web系统搭建——单机到分布式集群
    linux下用rinetd做端口转发
  • 原文地址:https://www.cnblogs.com/GY8023/p/13553469.html
Copyright © 2011-2022 走看看