可以参考之前更改commit的逻辑。不过要注意,如果设置了全局 hooks , 项目内的就无法使用了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/bin/sh

# 获取当前仓库的工作目录(去掉末尾的 .git/)
REPO_NAME=$(git remote get-url origin | xargs basename -s .git)
echo "Repository Name: $REPO_NAME"

# 定义处理特殊仓库的函数
panshi_pre() {
# 切换到项目的根目录
cd "$(git rev-parse --show-toplevel)" || { echo "Failed to change to toplevel directory"; exit 1; }
# 执行 kuai 命令生成 catalogue.md
/Users/thh/go/bin/kuai tool:build_catalogue > catalogue.md 2>&1
# 检查 catalogue.md 是否存在并且不是空的
if [ ! -s catalogue.md ]; then
echo "文件没有生成检查是否正常"
exit 0
fi
# 将 catalogue.md 添加到暂存区
git add catalogue.md
# 输出提示信息
echo "目录生成"
}

# 判断是否需要处理特殊仓库
if [[ "$REPO_NAME" == *"panshi-doc"* ]]; then
# 调用在后面定义的函数
panshi_pre
exit 0 # 如果函数内部没有退出,则在这里退出
else
echo "不需要生成目录"
exit 0
fi

阅读全文 »

之前一直用go写的多消费者,因为go存在channel,所以可以用有缓channel模拟队列进行消费和退出,但是java不存在channel,所以要是用一些内存queue,结果由于退出条件的判断不一样,导致java的代码进入空等待。一只没有释放资源。

go 原始代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

func main(){

type Item struct {
value string
}

queue:= make(chan Item,100)
task := StartTogether(func(){
for item:= range queue{
fmt.Println(item)
}
},10)
for i:=1;i<=10000;i++{
queue<-Item{
value: fmt.Sprintf("%v",i),
}
}

close(queue)
task.Wait()
}
func StartTogether(job func(), counter int) *sync.WaitGroup {
var wg sync.WaitGroup
for i := 1; i <= counter; i++ {
wg.Add(1)
go func() {
defer wg.Done()
job()
}()
}
return &wg
}

阅读全文 »

介绍 cangjie

当前安装前置操作: 微信公众号搜索: 仓颉编程语言 , 回复 SDK。 注册gitcode账号。当前仓颉 SDK 相关自料在gitcode上。目前只有 SDK ,还没有源码放出。

安装 - sdk - 安装 单文件运行 一个定时获取每日一句。

1
2
3
4
5
6
7
8
9
10
11
12
ps -ef | grep 'java'
jmap -dump:format=b,file=/home/work/jvmDmp.hprof [pid]
jmap -dump:live,format=b,file=/home/work/jvmDmp.hprof [pid]
jmap -histo:live 2253 | more
jmap -histo 2378 | more
jstack [pid]
jstack 2378 | more
jmap -histo:live 2378 | more

jps jinfo jstat jmap jstack

dmesg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
private ThreadPoolExecutor readExecutor  = new ThreadPoolExecutor(2, 2, 10, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(100), new ThreadPoolExecutor.CallerRunsPolicy());

public static void main(String[] args) {
new ThreatTest().deal();
System.exit(0);
}

public void deal() {


for (int i = 1; i <= 10000; i++) {
// 门店公司不玩跳公
int finalI = i;
readExecutor.execute(() -> execute(finalI));
System.out.println("run" + i);
}

while (true) {
if (writeExecutor.isTerminated() && readExecutor.isTerminated()) {

break;
}
}
}

private void execute(int i) {
try {
Thread.sleep(1000);
System.out.println(i);
} catch (InterruptedException e) {

}
return;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38

func taskQueueJob(id int, wg *sync.WaitGroup, ch chan struct{}, maxChan chan struct{}) {
defer func() {
<-ch // 任务完成后从通道中取出一个元素
<-maxChan
wg.Done()
}()
task(id)

}
func task(id int) {
fmt.Printf("Task %d is running...\n", id)
time.Sleep(1 * time.Second)
fmt.Printf("Task %d has been completed\n", id)
}

func runCallerRunsPolicy(cmd *cobra.Command, args []string) {
taskQueue := make(chan struct{}, 10)
maxTask := make(chan struct{}, 2)
wg := sync.WaitGroup{}
for i := 1; i <= 15; i++ {
select {
case taskQueue <- struct{}{}:
maxTask <- struct{}{}
wg.Add(1)
go taskQueueJob(i, &wg, taskQueue, maxTask)
default:
fmt.Printf("Task %d is executed by the main process\n", i)
task(i)
}
}

close(taskQueue)
wg.Wait()
close(maxTask)

}

0%