<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="FR" link="blue" vlink="purple" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">I doubt it will suddenly convince anyone, but I wrote a minimal example to illustrate the concrete problem.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">With the classic thread executor, the normal requests (fastIORequest) complete quickly even during concurrent CPU requests (slowCPURequest), while using the default Loom executor they
 are stuck for some time.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US">Arnaud<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">package
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">org.example</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">import
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">java.time.Duration</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">import
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">java.time.Instant</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">import
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">java.util.ArrayList</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">import
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">java.util.Timer</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">import
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">java.util.TimerTask</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">import
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">java.util.concurrent.Executors</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">import
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">java.util.concurrent.Future</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
<br>
<br>
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">public class
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">MixedServer
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">{<br>
<br>
   </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">static final
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant
</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#871094">t0
</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>now</i>();<br>
<br>
   </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">static long
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#00627A">slowCPURequest</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">String
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">name,
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">posted)
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">throws
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Exception
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">{<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">long
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">t
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#1750EB">0</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">var
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">n
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#1750EB">1e9</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
      <br>
      </span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#8C8C8C">// slow CPU-only stuff: e.g. image codec, XML manip, collection iteration, ...<br>
      </span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">for
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">int
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">i
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#1750EB">0</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">i
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808"><
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">n</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">i</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">++) {<br>
         </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">t
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">t
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">+
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#1750EB">2</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
      }<br>
      <br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">var
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">completed
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>now</i>();<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">System</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#871094">out</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.println(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Duration</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>between</i>(</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#871094">t0</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">,
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>now</i>()) +
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#067D17">" - "
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">+ name<br>
            +  </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#067D17">" completed (duration: "
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">+
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Duration</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>between</i>(posted,
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">completed</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">) +
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#067D17">")"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">);<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">return
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">t</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
   }<br>
<br>
   </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">static
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Object
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#00627A">fastIORequest</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">posted)
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">throws
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Exception
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">{<br>
      </span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#8C8C8C">// IO stuff, e.g. JDBC call<br>
      // (but sleep would have the same effect for this test, i.e. block the thread)<br>
      </span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Thread</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>sleep</i>(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#1750EB">2</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">);<br>
      <br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">var
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">completed
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>now</i>();<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">System</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#871094">out</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.println(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Duration</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>between</i>(</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#871094">t0</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">,
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>now</i>()) +
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#067D17">" - fast IO task"<br>
            </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">+ 
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#067D17">" completed (duration: "
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">+
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Duration</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>between</i>(posted,
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">completed</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">) +
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#067D17">")"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">);<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">return null</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
   }<br>
   <br>
   <br>
   </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">public static void
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#00627A">main</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">String</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">[]
 args) </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">throws
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Exception
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">{<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">var
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">executor
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=<br>
            </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Executors</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>newVirtualThreadPerTaskExecutor</i>();
</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#8C8C8C">// unfair<br>
            //Executors.newCachedThreadPool(); // fair<br>
      <br>
      </span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">var
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">timer
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">new
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">Timer();<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">timer</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.schedule(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">new
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">TimerTask</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">() {<br>
         </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#9E880D">@Override<br>
         </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">public void
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#00627A">run</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">() {<br>
            </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">var
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">posted
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>now</i>();<br>
            </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#851691">executor</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.submit(() ->
<i>fastIORequest</i>(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#851691">posted</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">));<br>
         }<br>
      }, </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#1750EB">100</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">,
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#1750EB">100</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">);<br>
      <br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">var
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">futures
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">new
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">ArrayList<</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Future</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">>();<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">for
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">int
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">i
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#1750EB">0</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">i
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808"><
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#1750EB">60</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">i</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">++) {<br>
         </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">final var
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">name
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#067D17">"Task_"
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">+
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">i</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">;<br>
         </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">var
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">posted
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">=
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Instant</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.<i>now</i>();<br>
         </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">futures</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.add(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">executor</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.submit(()
 -> <i>slowCPURequest</i>(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#851691">name</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">,
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#851691">posted</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">)));<br>
      }<br>
      <br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#0033B3">for
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">Future f</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">:
</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">futures</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">)<br>
         </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">f</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.get();<br>
<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">System</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.</span><i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#871094">out</span></i><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.println(</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#067D17">"---
 done ---"</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">);<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">executor</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.shutdownNow();<br>
      </span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:black">timer</span><span lang="EN-US" style="font-size:10.0pt;font-family:"Courier New";color:#080808">.cancel();<br>
   }<br>
}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="mso-fareast-language:EN-US"><o:p> </o:p></span></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;mso-line-height-alt:.75pt"><span style="font-size:1.0pt;color:white">Great, then one someone who runs CPU-heavy jobs that are appropriate for virtual threads presents a problem the’ve encountered that could be
 solved by some form of time-sharing, we’ll take a look. For the time being, we have a hypothesis that
<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt;mso-line-height-alt:.75pt"><span style="font-size:1.0pt;color:white">ZjQcmQRYFpfptBannerStart<o:p></o:p></span></p>
</div>
<p class="MsoNormal" style="margin-left:35.4pt"><span lang="EN-US">Great, then one someone who runs CPU-heavy jobs that are appropriate for virtual threads presents a problem the’ve encountered that could be solved by some form of time-sharing, we’ll take a
 look. </span>For the time being, we have a hypothesis that one or more problems could occur, and a further hypothesis that some class of solutions might fix or mitigate them. Unfortunately, theses hypotheses are not presently actionable.
<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">I don’t know what problem Go’s maintainers solve with time-sharing. Maybe they just want to solve Go’s lack of convenient access to a scheduler with time-sharing even in the case of background processing tasks
 — a problem that Java doesn’t have — or perhaps they’ve managed to identify common server workloads that could be helped by time-sharing, in which case we’d love to see those workloads so that we can make sure our fix works.
<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">I am not at all resistant to adding time-sharing to the virtual thread scheduler. I am resistant to fixing bugs that have not been reported. I have said many times — and not just on the mailing lists — that the
 best and often only way to get a some change made to Java is to report a problem. You might have noticed that all JEPs start with a motivation section that attempts to clearly present a problem that’s encountered by Java’s users (and sometimes maintainers)
 and analyse its relative severity to justify the proposed solution. That is usually the JEP’s most important section (and the section we  typically spend most time writing) because the most important thing is to understand the problem you’re trying to tackle.
 Every change has a cost. A feature might add overhead that harms workloads that don’t benefit from it, and it certainly has an opportunity cost. Neither of these is disqualifying, but we simply cannot judge the pros and cons of doing something until we can
 weigh some problem against another, and we can’t even get started on this process until we have a problem in front of us.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">We *have* been presented with a problem that some specific kind of time-sharing can solve (postponing a batch job that’s consuming resources to run at a much later time), and it is one of the reasons we’ve added
 custom schedulers that will be able to employ it to our roadmap. It is certainly possible that the lack of time-sharing causes problems that need addressing in the default (currently only) virtual-thread scheduler — I am not at all dismissing that possibility
 — but there’s not much we can do until those problems are actually reported to us, which would allow us to know more about when those problems occur, how frequently, and what kind of time-sharing can assist in which circumstances and to what degree. There’s
 no point in trying to convince us of something we are already convinced of, namely that the possibility exists that some virtual thread workloads could be significantly helped by time-sharing. In fact, I’ve mentioned that possibility on this mailing list a
 few times already.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">If the problems are common, now that more people are giving virtual threads a try, I expect they will be reported by someone soon enough and we could start the process of tackling them.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">— Ron<o:p></o:p></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><br>
<br>
<o:p></o:p></p>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<div>
<p class="MsoNormal" style="margin-left:35.4pt">On 9 Jan 2023, at 08:48, Sam Pullara <<a href="mailto:spullara@gmail.com">spullara@gmail.com</a>> wrote:<o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">Ron, I think you are being purposefully obtuse by not recognizing that some folks are going to run high CPU jobs in vthreads. The proof is with the folks using Go that already encountered it and fixed it.<o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal" style="margin-left:35.4pt">On Mon, Jan 9, 2023 at 12:46 AM Arnaud Masson <<a href="mailto:arnaud.masson@fr.ibm.com">arnaud.masson@fr.ibm.com</a>> wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;margin-left:4.8pt;margin-right:0cm">
<div>
<div>
<div>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-US">Side note : it seems “more” preemptive time sharing was added for goroutines in Go 1.14 to avoid the kind of scheduling starvation we discussed:</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-US"><a href="https://medium.com/a-journey-with-go/go-asynchronous-preemption-b5194227371c" target="_blank">https://medium.com/a-journey-with-go/go-asynchronous-preemption-b5194227371c</a></span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-US"> </span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-US">Thanks</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-US">Arnaud</span><o:p></o:p></p>
<p class="MsoNormal" style="mso-margin-top-alt:auto;mso-margin-bottom-alt:auto;margin-left:35.4pt">
<span lang="EN-US"> </span><o:p></o:p></p>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
<p class="MsoNormal" style="margin-left:35.4pt"><o:p> </o:p></p>
</div>
</div>
</div>

<DIV>
Unless otherwise stated above:<BR>
<BR>
Compagnie IBM France<BR>
Siège Social : 17, avenue de l'Europe, 92275 Bois-Colombes Cedex<BR>
RCS Nanterre 552 118 465<BR>
Forme Sociale : S.A.S.<BR>
Capital Social : 664 069 390,60 €<BR>
SIRET : 552 118 465 03644 - Code NAF 6203Z<BR>
</DIV></body>
</html>