zoukankan      html  css  js  c++  java
  • java_线程-锁

    package com.demo.test3;
    
    import java.util.concurrent.CountDownLatch;
    
    /**
     * @author QQ: 1236897
     *
     */
    //闭锁
    //nThread - 线程数目
    //startGate -确保所有线程就绪-》countDown->所有线程工作
    //endGate - 等待所有线程完成工作后才返回timeTask方法
    public class CountDownLockTest {
    
        /**
         * @param args
         */
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Caller caller = new Caller();
            MyTask task = new MyTask();
    
            try {
                System.out.println(caller.timeTask(5, task));
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
    }
    
    class Caller {
    
        public long timeTask(int nThreads, final Runnable task)
                throws InterruptedException {
    
            final CountDownLatch startGate = new CountDownLatch(1);
            final CountDownLatch endGate = new CountDownLatch(nThreads);
    
            for (int i = 0; i < nThreads; i++) {
                Thread t = new Thread() {
    
                    public void run() {
                        try {
                            System.out.println("startGate await");
                            startGate.await();
                            try {
                                task.run();
                            } finally {
                                endGate.countDown();
                            }
    
                        } catch (InterruptedException e) {
                        }
                    }
    
                };
    
                t.start();
            }
    
            long start = System.nanoTime();
            System.out.println("startGate countDown");
            startGate.countDown();
            endGate.await();
            long end = System.nanoTime();
            System.out.println("return");
            return end - start;
        }
    
    }
    
    class MyTask implements Runnable {
    
        /*
         * (non-Javadoc)
         * 
         * @see java.lang.Runnable#run()
         */
        @Override
        public void run() {
            // TODO Auto-generated method stub
            System.out.println("id sleep: - " + Thread.currentThread().getId());
            try {
                Thread.sleep(5000);
                System.out.println("Sleep done: - "
                        + Thread.currentThread().getId());
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                Thread.currentThread().interrupt();
            }
        }
    
    }
  • 相关阅读:
    Exchanger, Changing data between concurrent tasks
    Java Concurrency
    Linux禁止ping以及开启ping的方法
    Linux内存使用消耗高
    Linux主机系统目录误操作权限修改为777修复方法
    linux磁盘空间用满的处理方法
    Linux查看实时带宽流量情况
    网站无法打开通常解决方法
    iptables的conntrack表满了导致访问网站很慢
    影响网站打开速度的因素有哪些
  • 原文地址:https://www.cnblogs.com/MarchThree/p/4769858.html
Copyright © 2011-2022 走看看