Skip to content

Commit 6f0ad55

Browse files
Utilize VT if possible (#381)
* Utilize VT if possible Also, do not pre-create as many threads as many cores reported by Java as many times they are simply unused. * Add Javadoc * Build by jdk21 in profile * Force release by jdk 21 at least --------- Co-authored-by: Slawomir Jaranowski <[email protected]>
1 parent e8ea0cb commit 6f0ad55

File tree

4 files changed

+129
-3
lines changed

4 files changed

+129
-3
lines changed

pom.xml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,4 +182,42 @@
182182
</plugins>
183183
</build>
184184

185+
<profiles>
186+
<profile>
187+
<id>jdk21</id>
188+
<activation>
189+
<jdk>[21,)</jdk>
190+
</activation>
191+
<build>
192+
<plugins>
193+
<plugin>
194+
<groupId>org.apache.maven.plugins</groupId>
195+
<artifactId>maven-compiler-plugin</artifactId>
196+
<executions>
197+
<execution>
198+
<id>java21</id>
199+
<goals>
200+
<goal>compile</goal>
201+
</goals>
202+
<phase>compile</phase>
203+
<configuration>
204+
<release>21</release>
205+
<compileSourceRoots>
206+
<compileSourceRoot>${project.basedir}/src/main/java21</compileSourceRoot>
207+
</compileSourceRoots>
208+
<multiReleaseOutput>true</multiReleaseOutput>
209+
</configuration>
210+
</execution>
211+
</executions>
212+
</plugin>
213+
</plugins>
214+
</build>
215+
</profile>
216+
<profile>
217+
<id>plexus-release</id>
218+
<properties>
219+
<minimalJavaBuildVersion>21</minimalJavaBuildVersion>
220+
</properties>
221+
</profile>
222+
</profiles>
185223
</project>

src/main/java/org/codehaus/plexus/archiver/zip/ConcurrentJarCreator.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.io.SequenceInputStream;
2424
import java.io.UncheckedIOException;
2525
import java.util.concurrent.ExecutionException;
26-
import java.util.concurrent.Executors;
2726
import java.util.zip.Deflater;
2827
import java.util.zip.ZipEntry;
2928

@@ -119,8 +118,8 @@ public ConcurrentJarCreator(boolean compressAddedZips, int nThreads) throws IOEx
119118
manifest = createDeferred(defaultSupplier);
120119
directories = createDeferred(defaultSupplier);
121120
synchronousEntries = createDeferred(defaultSupplier);
122-
parallelScatterZipCreator =
123-
new ParallelScatterZipCreator(Executors.newFixedThreadPool(nThreads), defaultSupplier);
121+
parallelScatterZipCreator = new ParallelScatterZipCreator(
122+
ConcurrentJarCreatorExecutorServiceFactory.createExecutorService(nThreads), defaultSupplier);
124123
}
125124

126125
/**
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
package org.codehaus.plexus.archiver.zip;
19+
20+
import java.util.concurrent.ExecutorService;
21+
import java.util.concurrent.LinkedBlockingQueue;
22+
import java.util.concurrent.ThreadFactory;
23+
import java.util.concurrent.ThreadPoolExecutor;
24+
import java.util.concurrent.TimeUnit;
25+
import java.util.concurrent.atomic.AtomicInteger;
26+
27+
/**
28+
* Classic (pre Java 21) implementation. Create one thread eagerly, but allow pool to scale up to provided
29+
* number (usually set to Java reported CPU count). Apply same thread names as well.
30+
*
31+
* @since 4.10.1
32+
*/
33+
public class ConcurrentJarCreatorExecutorServiceFactory {
34+
private static final AtomicInteger POOL_COUNTER = new AtomicInteger();
35+
36+
static ExecutorService createExecutorService(int poolSize) {
37+
ThreadGroup threadGroup = Thread.currentThread().getThreadGroup();
38+
int poolCount = POOL_COUNTER.incrementAndGet();
39+
AtomicInteger threadCounter = new AtomicInteger();
40+
ThreadFactory threadFactory = new ThreadFactory() {
41+
@Override
42+
public Thread newThread(Runnable r) {
43+
Thread thread =
44+
new Thread(threadGroup, r, "plx-arch-" + poolCount + "-" + threadCounter.incrementAndGet());
45+
thread.setDaemon(true);
46+
return thread;
47+
}
48+
};
49+
return new ThreadPoolExecutor(1, poolSize, 1L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), threadFactory);
50+
}
51+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*
17+
*/
18+
package org.codehaus.plexus.archiver.zip;
19+
20+
import java.util.concurrent.ExecutorService;
21+
import java.util.concurrent.Executors;
22+
import java.util.concurrent.atomic.AtomicInteger;
23+
24+
/**
25+
* Post Java 21 implementation. Create one Virtual Thread per task execution. Apply same thread names as well.
26+
*
27+
* @since 4.10.1
28+
*/
29+
public class ConcurrentJarCreatorExecutorServiceFactory {
30+
private static final AtomicInteger POOL_COUNTER = new AtomicInteger();
31+
32+
static ExecutorService createExecutorService(int poolSize) {
33+
int poolCount = POOL_COUNTER.incrementAndGet();
34+
AtomicInteger threadCounter = new AtomicInteger();
35+
return Executors.newThreadPerTaskExecutor(
36+
Thread.ofVirtual().name("plx-arch-" + poolCount + "-" + threadCounter.incrementAndGet()).factory());
37+
}
38+
}

0 commit comments

Comments
 (0)