`
wisfly
  • 浏览: 62940 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
社区版块
存档分类
最新评论

CountDownLatch(一个同步辅助类)

 
阅读更多


小伙伴们,我开了一家海淘护肤品淘宝店,搜索店铺“禾子蝶的海淘铺”,正品保证,欢迎进店选购哦。谢谢!

 

CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

主要方法

 public CountDownLatch(int count);

 public void countDown();

 public void await() throws InterruptedException
 

构造方法参数指定了计数的次数

countDown方法,当前线程调用此方法,则计数减一

awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0,保证线程同步。

 

例如:

 Baiye片段代码:

public Appclient buildApp(final AppParam appDTO) throws Exception {
        final Appclient client = new Appclient();
        client.setAppid(appDTO.getAppid());
        int count = appDTO.getPlatformAndriod() + appDTO.getPlatformIos();
        final CountDownLatch countdown = new CountDownLatch(count);
        if (appDTO.getPlatformAndriod() == 1) {
            Thread androidThread = new Thread() {
                public void run() {
                    try {
                        String releaseUrl = buildAndriod(appDTO, client);
                        if (releaseUrl != null)
                            client.setAndroidFile(releaseUrl);
                        countdown.countDown();
                        logger.info("Build android finished:" + releaseUrl);
                    } catch (Exception e) {
                        countdown.countDown();
                        logger.error(e.getMessage(), e);
                    }
                }
            };
            androidThread.start();
        }
        if (appDTO.getPlatformIos() == 1) {
            Thread iosThread = new Thread() {
                public void run() {
                    try {
                        String releaseUrl = null;
                        releaseUrl = buildIos(appDTO, client);
                        if (releaseUrl != null)
                            client.setIosFile(releaseUrl);
                        countdown.countDown();
                        logger.info("Build ios finished:" + releaseUrl);
                    } catch (Exception e) {
                        countdown.countDown();
                        logger.error(e.getMessage(), e);
                    }

                }
            };
            iosThread.start();
        }
        countdown.await();
        return client;
    }

 

 

public String buildAndriod(AppParam appDTO, Appclient client)
            throws Exception {
        // 1.Create build directory
        String appBuildDir = Utility.APP_PKG_DIR + "/app" + appDTO.getAppid()
                + "/android";
        FileUtil.createDir(appBuildDir);
        String andriodAppFileName = Cn2Spell.converterToSpell(appDTO.getName())
                .replaceAll(" ", "_").replaceAll("_", "");
        String andriodAppFile = "/app" + appDTO.getAppid() + "/android/"
                + andriodAppFileName + "-release.apk";
        String downloadUrlStr =andriodAppFile;
        // 2.Create config.xml
        Document document = DocumentHelper.createDocument(); // 创建文档
        Element root = document.addElement("root");
        Element appname = root.addElement("appname");
        Element appid = root.addElement("appid");
        Element apkname = root.addElement("appfilename");
        Element packagename = root.addElement("packagename");
        Element desc = root.addElement("description");
        Element downloadUrl = root.addElement("downloadurl");
        Element loadURL = root.addElement("loadURL");
        Element p12password = root.addElement("p12password");// ios预留字段

        p12password.setText("test");
        String package_name = "by"
                + Cn2Spell.converterToSpell(appDTO.getName())
                        .replaceAll(" ", "").replaceAll("_", "")
                + Random.getRandomInt(4);
        loadURL.setText(Config.getString("appH5Url")+appDTO.getUrl());
        appname.setText(appDTO.getName());// 设置app 名字
        appid.setText(appDTO.getAppid());// h5地址
        apkname.setText(andriodAppFileName);// 设置应用名
        packagename.setText(package_name);// 设置包名
        desc.setText("");//
        downloadUrl.setText(downloadUrlStr);
        // 设置Android相关配置
        client.setApkName(Cn2Spell.converterToSpell(appDTO.getName()));
        client.setPackageName(package_name);

        XMLWriter xmlWriter = null;
        // 生成配置文件
        String configFile = appBuildDir + "/build_config.xml";
        try {
            OutputFormat outFormat = OutputFormat.createPrettyPrint();
            outFormat.setEncoding("UTF-8");
            outFormat.setTrimText(false);
            xmlWriter = new XMLWriter(new FileOutputStream(configFile),
                    outFormat);
            xmlWriter.write(document);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }

        // 4.Copy img file from net
        String apkImgDir = appBuildDir + "/png/";
        FileUtil.createDir(apkImgDir);
        String srcFile = Constant.PIC_SERVER_VPN + appDTO.getIcon();
        String dstfile = apkImgDir + Utility.APP_ANDRIOD_ICON_NAME;
        ImgHelper.writeImg(srcFile, dstfile);

        // 4.Run build cmd
        JavaShellUtil shellUtil = new JavaShellUtil();

        dstfile = appBuildDir + "/build_android.sh";
        FileUtil.copyFile(new File(Utility.SH_DIR), new File(dstfile));

        String shellCmd = "sh " + appBuildDir + "/build_android.sh "
                + appBuildDir;
        logger.info("sh command:" + shellCmd);
        shellUtil.executeShell(shellCmd);

        FastdfsUtil fast = new FastdfsUtil();
        String[] rsPath = fast.uploadFile(appBuildDir + "/"
                + andriodAppFileName + "-release.apk", "apk", null);
        downloadUrlStr = "/" + rsPath[0] + "/" + rsPath[1];

        // 5.Check build status
        logger.info("Android DownloadFile:" + Utility.APP_PKG_DIR
                + andriodAppFile);
        if (FileUtil.isFileExist(Utility.APP_PKG_DIR + andriodAppFile)) {
            // appDTO.setAndriodAppFile(andriodAppFile);
            return downloadUrlStr;
        } else {
            return null;
        }
    }

    /**
     * 生成IOS客户端
     *
     * @param appDTO
     * @param client
     * @return
     * @throws Exception
     */
    public String buildIos(AppParam appDTO, Appclient client) throws Exception {
        // 1.Create build directory
        String appBuildDir = Utility.APP_PKG_DIR + "/app" + appDTO.getAppid()
                + "/ios";
        FileUtil.createDir(appBuildDir);
        String iosAppFileName = Cn2Spell.converterToSpell(appDTO.getName())
                .replaceAll(" ", "_").replaceAll("_", "");
        String iosAppFile = "/app" + appDTO.getAppid() + "/ios/"
                + iosAppFileName + "-release.ipa";
        String downloadUrlStr =iosAppFile;
        // 2.Create config.xml
        Document document = DocumentHelper.createDocument(); // 创建文档
        Element root = document.addElement("root");
        Element appname = root.addElement("appname");
        Element appid = root.addElement("appid");
        Element apkname = root.addElement("appfilename");
        Element packagename = root.addElement("packagename");
        Element desc = root.addElement("description");
        Element downloadUrl = root.addElement("downloadurl");
        Element loadURL = root.addElement("loadURL");
        Element p12password = root.addElement("p12password");// ios预留字段

        p12password.setText("123456");
        String package_name = "by"
                + Cn2Spell.converterToSpell(appDTO.getName())
                        .replaceAll(" ", "").replaceAll("_", "")
                + Random.getRandomInt(4);
        loadURL.setText(Config.getString("appH5Url")+appDTO.getUrl());
        appname.setText(appDTO.getName());// 设置app 名字
        appid.setText(appDTO.getAppid());// h5地址
        apkname.setText(iosAppFileName);// 设置应用名
        packagename.setText(package_name);// 设置包名
        desc.setText("");//
        downloadUrl.setText(downloadUrlStr);
        // 设置IOS相关配置
        client.setApkName(Cn2Spell.converterToSpell(appDTO.getName()));
        client.setPackageName(package_name);

        XMLWriter xmlWriter = null;
        // 生成配置文件
        String configFile = appBuildDir + "/build_config.xml";
        try {
            OutputFormat outFormat = OutputFormat.createPrettyPrint();
            outFormat.setEncoding("UTF-8");
            outFormat.setTrimText(false);
            xmlWriter = new XMLWriter(new FileOutputStream(configFile),
                    outFormat);
            xmlWriter.write(document);
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }

        // 4.Copy img file from net
        String apkImgDir = appBuildDir + "/png/";
        FileUtil.createDir(apkImgDir);
        String srcFile = Constant.PIC_SERVER_VPN + appDTO.getIcon();
        String dstfile = apkImgDir + Utility.APP_IOS_ICON_NAME1;
        String dstfile2 = apkImgDir + Utility.APP_IOS_ICON_NAME2;
        ImgHelper.writeImg(srcFile, dstfile);
        ImgHelper.writeImg(srcFile, dstfile2);
        // 4.Run build cmd
        JavaShellUtil shellUtil = new JavaShellUtil();

        dstfile = appBuildDir + "/build_ios.sh";
        FileUtil.copyFile(new File(Utility.SH_DIR_IOS), new File(dstfile));

        String shellCmd = "sh " + appBuildDir + "/build_ios.sh " + appBuildDir;
        logger.info("sh command:" + shellCmd);
        shellUtil.executeShell(shellCmd);

        FastdfsUtil fast = new FastdfsUtil();
        String[] rsPath = fast.uploadFile(appBuildDir + "/" + iosAppFileName
                + "-release.ipa", "ipa", null);
        String ipa= Config.getString("APP_DOWNLOAD_SERVER_IOS")
                + rsPath[0] + "/" + rsPath[1];
        //生成plist文件
        String[] rsPathIcon = fast.uploadFile( apkImgDir + Utility.APP_IOS_ICON_NAME1, "png", null);
        String iconUrl= Config.getString("APP_DOWNLOAD_SERVER_IOS")
                + rsPathIcon[0] + "/" + rsPathIcon[1];
        String iconUrl1=iconUrl+"?filename="+Utility.APP_IOS_ICON_NAME1;
        String iconUrl2=iconUrl+"?filename="+Utility.APP_IOS_ICON_NAME2;
        String plistContent=IosPlist.getPlist(ipa, iconUrl1,iconUrl2, package_name, iosAppFileName);
       
        String []plist=fast.uploadFile(plistContent.getBytes(), "plist", null);
        downloadUrlStr="/"
                + plist[0] + "/" + plist[1];
        // 5.Check build status
        logger.info("ios DownloadFile:" + Utility.APP_PKG_DIR + iosAppFile);
        if (FileUtil.isFileExist(Utility.APP_PKG_DIR + iosAppFile)) {
            return downloadUrlStr;
        } else {
            return null;
        }
    }

 

小伙伴们,我开了一家海淘护肤品淘宝店,搜索店铺“禾子蝶的海淘铺”,正品保证,欢迎进店选购哦。谢谢!

分享到:
评论

相关推荐

    CountDownLatchDemo

    这是一个对于Java CountDownLatch的简单Demo CountDownLatch一个同步辅助类 在完成一组正在其他线程中执行的操作之前 它允许一个或多个线程一直等待 用给定的计数 初始化 CountDownLatch 由于调用了 countDown 方法 ...

    CountDownLatch、Semaphore等4大并发工具类详解

    CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一组线程完成操作,再继续执行。其原理是通过一个计数器来实现的,计数器的初始值为需要等待线程的数量。当主线程调用 CountDownLatch 的 await() ...

    CountDownLatch学习用法

    CountDownLatch是Java并发编程中一个重要的工具类,它属于java.util.concurrent包下的一个同步辅助类。这个类的设计目的是允许一个线程等待其他多个线程完成操作,然后再继续执行。CountDownLatch通常用于多线程协作...

    Java中CountDownLatch进行多线程同步详解及实例代码

    CountDownLatch是Java中的一种多线程同步辅助类,主要用来同步多个任务的执行。它允许一个或多个线程等待,直到一组正在其他线程中执行的操作完成。下面是对CountDownLatch的详细解释和实例代码。 CountDownLatch的...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    在Java并发编程中,`CountDownLatch`是一个同步辅助类,它允许多个线程等待其他线程完成操作。在批量插入数据的场景下,可以创建一个CountDownLatch对象,初始化为线程的数量,每个线程处理完自己的数据后调用`...

    Java中的5种同步辅助类介绍

    Java中的同步辅助类是用于控制并发执行和线程间协作的重要工具,它们提供了比`synchronized`关键字和`wait/notify`机制更为高级和灵活的同步机制。以下将详细介绍五种常用的同步辅助类: 1. **Semaphore(信号量)*...

    并发编程之CountDownLatch

    CountDownLatch 是一个同步的辅助类,它可以允许一个或多个线程等待,直到一组在其它线程中的操作执行完成。它通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就...

    java线程并发countdownlatch类使用示例

    1. `CountDownLatch`是一个同步辅助类,用于协调多个线程间的同步。 2. 它有一个不可改变的计数器(初始值),在构造时设定。 3. 每次调用`countDown()`方法,计数器减1,当计数器为0时,所有调用`await()`的线程将...

    Java并发工具辅助类代码实例

    CountDownLatch是一种同步工具,允许一个或多个线程等待其他线程完成操作。它主要通过countDown(计数器)和await(阻塞)方法来实现同步。只有当计数器减为0的时候,当前线程才可以往下继续执行。 下面是一个使用...

    并发编程——并发工具类.pdf

    1. **概念与作用**:CountDownLatch是一个同步辅助类,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成为止。它本质上是一个倒计时门闩,用于控制一个线程或者多个线程的等待与继续执行。 2. **使用...

    Java实监控同步的代码

    8. ** CountDownLatch 计数器门**:它是一个一次性使用的同步辅助类,用于等待一组操作完成。计数器从正整数开始,每当一个线程完成其任务时,计数器减1,当计数器为零时,所有等待的线程都被释放。 9. ** ...

    Java编程中静态内部类与同步类的写法示例

    `CountDownLatch`是一个典型的同步工具类,它允许一个或多个线程等待其他线程完成操作。通常用在启动多个线程执行任务,并在所有任务完成后再继续执行后续操作的场景。`CountDownLatch`初始化时设置一个计数,每次...

    Java并发工具类示例

    `CyclicBarrier`是另一个同步辅助类,允许一组线程等待其他线程到达屏障点再继续执行。在`Demo_CyclicBarrier.java`中,我们可以看到如何设定屏障点,所有线程必须到达此点才能继续。CyclicBarrier还可以执行一个回...

    Java CountDownLatch完成异步回调实例详解

    Java 中的 CountDownLatch 是一个同步辅助类,允许一个线程等待其他线程完成操作。它是一种非常有用的工具,用于在多线程环境中实现异步回调。在本文中,我们将学习如何使用 CountDownLatch 来完成异步回调实例,并...

    聊聊锁的那些事

    sun.misc.Unsafe是Java中的一个类,它提供了许多低级别的、不安全的操作,比如直接操作内存和线程。虽然这个类通常不建议使用,因为它可能破坏Java的类型安全,但在某些特定的场景下,比如实现高性能的锁机制,它...

    Java主线程等待子线程执行完毕

    CountDownLatch 是一个同步辅助类,它允许一个或多个线程等待某些操作的完成。它的主要作用是将一个计数器初始化为某个值,然后在每个线程执行完毕时将计数器减一,当计数器减到零时,等待的线程将被唤醒。 在上面...

    java之JUC系列.pdf

    CountDownLatch是一个同步辅助类,它可以设置一个初始计数,然后通过countDown()方法递减,当计数为零时释放所有等待的线程。这可以用来等待某个事件的发生,比如多个线程加载资源完毕。 Semaphore(信号量)用于...

    多线程的批量线程同步解决方案

    4. **CountDownLatch**:这是一个一次性使用的同步辅助类,用于让一组线程等待其他线程完成操作。在批量处理中,主线程可能使用CountDownLatch来等待所有子线程完成任务,然后继续执行后续操作。 5. **...

    《软件开发基础(Java)》实验报告-Java多线程编程.docx

    CyclicBarrier是一个同步辅助类,允许一组线程等待其他线程到达一个公共屏障点。在所有线程到达屏障点后,屏障会释放,所有线程继续执行。CyclicBarrier在多线程排序场景中起到了关键作用,确保所有线程完成排序后再...

    java中的并发变成学习笔记2

    - **CountDownLatch**:它是一个一次性使用的同步辅助类,用于计数。当计数器归零时,所有等待的线程会被释放。在并行计算场景中,CountDownLatch常用来确保所有子任务执行完毕后再进行下一步操作。例如,在`...

Global site tag (gtag.js) - Google Analytics