<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div class="elementToProof" style="font-family: Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Thanks for sharing that. It is a nice solution to my problem. I wouldn't have thought about having a ThreadFactory with a Semaphore for a ThreadFactory. But it looks simple and solves the problem.<br>
<br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> loom-dev <loom-dev-retn@openjdk.org> on behalf of Daniel Avery <danielaveryj@gmail.com><br>
<b>Sent:</b> May 13, 2024 6:56 PM<br>
<b>To:</b> loom-dev <loom-dev@openjdk.java.net><br>
<b>Subject:</b> Re: Resource Constrained Thread Per Task Executor</font>
<div> </div>
</div>
<div>
<div dir="ltr">If you did need to integrate a semaphore into an ExecutorService, you might find it easier to implement a ThreadFactory, and then leverage the utility methods in Executors to get an ExecutorService.
<div><br>
<div><font face="monospace">```</font></div>
<div>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">Semaphore sem = new Semaphore(permits);</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">ThreadFactory factory1 = Thread.ofVirtual().factory();</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">ThreadFactory factory2 = runnable -> {</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">    try {</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">        sem.acquire();</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">        return factory1.newThread(() -> {</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">            try {</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">                runnable.run();</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">            } finally {</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">                sem.release();</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">            }</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">        });</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">    } catch (InterruptedException ie) { // interrupted in acquire()</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">        Thread.currentThread().interrupt();</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">        throw new RuntimeException(ie);</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">    } catch (Throwable t) { // threw in newThread()</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">        sem.release();</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">        throw t;</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">    }</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">};</font></p>
<p class="x_gmail-p1" style="margin:0px; font-variant-numeric:normal; font-variant-east-asian:normal; font-variant-alternates:normal; font-kerning:auto; font-feature-settings:normal; font-stretch:normal; font-size:13px; line-height:normal">
<font face="monospace">ExecutorService es = Executors.newThreadPerTaskExecutor(factory2);</font></p>
</div>
<div><font face="monospace">```</font></div>
<div><br>
</div>
<div>- Daniel</div>
</div>
</div>
</div>
</body>
</html>