Semaphore 测试

package com.huang.test.concurrent;

import java.util.concurrent.Semaphore;

/**
 * java 信号量测试, 通常是多个线程争抢有限资源的情况下的使用
 */
public class SemphoreTest {
    public static void main(String[] args) {
        SemphoreTest st = new SemphoreTest();
        st.test();
    }

    private void test() {
        Semaphore sem = new Semaphore(3);
        for(int i = 1;i <= 5;i++)
        {
            new MyThread(sem, i).start();
        }
    }

    class MyThread extends Thread
    {
        private Semaphore sem;
        private int sec;
        MyThread(Semaphore sem, int sec)
        {
            this.sem = sem;
            this.sec = sec;
        }

        @Override
        public void run() {
            super.run();
            try {
                sem.acquire();

                System.out.println("thread " + sec + " start...");
                Thread.sleep(sec * 1000);
                System.out.println("thread " + sec + " end...");

                sem.release();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
            }
        }
    }
}

 

### 如何使用 Semaphore 构建 Docker 镜像 #### 准备工作 为了构建 Docker 镜像,首先需要安装并配置好 Docker 和 Semaphore CI/CD 平台。确保本地环境或远程服务器上已正确设置这两个工具。 #### 创建项目仓库 在 GitHub 或其他 Git 托管服务中创建一个新的项目仓库来保存应用源码以及后续要编写的 `Dockerfile` 文件和其他必要的脚本文件。 #### 编写 Dockerfile 在一个名为 `Dockerfile` 的文本文件内定义应用程序所需的操作系统基础镜像及其依赖项: ```dockerfile FROM python:3.9-slim-buster WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt COPY . . CMD ["python", "app.py"] ``` 此段代码指定了基于 Python 3.9 版本的基础镜像,并设置了工作目录 `/app`;接着复制项目的依赖列表 (`requirements.txt`) 到容器内的相应位置并执行安装命令;最后把当前目录下的所有文件拷贝到容器的工作空间下[^2]。 #### 设置 Semaphore 流水线 登录到 Semaphore 账户后,在对应的项目页面点击“Add New Pipeline”,按照提示填写相关信息完成流水线设定过程。对于简单的应用场景来说,默认选项通常就足够用了。 #### 添加构建步骤 编辑 `.semaphore/semaphore.yml` 文件以指定具体的持续集成任务流程。下面是一个基本的例子展示如何编写用于打包和推送 Docker 映像的任务清单: ```yaml version: v1.0 name: Build and Push Docker Image agent: machine: type: e1-standard-2 os_image: ubuntu1804 blocks: - name: Checkout Codebase task: jobs: - name: checkout commands: - git clone https://github.com/user/repo.git $SEMAPHORE_PROJECT_DIR - name: Build & Test Application task: jobs: - name: build-and-test-app commands: - cd repo/ - docker build -t my-docker-image:$BRANCH_NAME-$COMMIT_SHA . - docker run --rm my-docker-image:$BRANCH_NAME-$COMMIT_SHA pytest - name: Publish to Registry task: secrets: - name: dockerhub_credentials jobs: - name: publish-to-registry commands: - echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin - docker push my-docker-image:$BRANCH_NAME-$COMMIT_SHA ``` 上述 YAML 文档描述了一套完整的自动化操作序列:从检出最新版本的应用程序源码开始,经过测试验证无误之后再将其构建成可分发的形式,最终上传至私有或公共注册表供部署环节调用[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值