<!DOCTYPE html><html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
On 23/09/2024 06:42, Adam Sotona wrote:<br>
<blockquote type="cite" cite="mid:DS0PR10MB6847EE2D14175ADEBDE4404F8C6F2@DS0PR10MB6847.namprd10.prod.outlook.com">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style>@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:Aptos;
panose-1:2 11 0 4 2 2 2 2 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Aptos",sans-serif;
mso-ligatures:standardcontextual;}.MsoChpDefault
{mso-style-type:export-only;
font-size:11.0pt;
mso-ligatures:none;}div.WordSection1
{page:WordSection1;}</style>
<div class="WordSection1">
<p class="MsoNormal">Hi,</p>
<p class="MsoNormal">I’m updating my classroom examples to run
on JDK 23 and with IO.println I experience different behavior
than with System.out.println. Following example explains the
issue.</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Thank you,</p>
<p class="MsoNormal">Adam</p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:#336BDD;mso-ligatures:none">static</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
</span><span style="font-size:9.0pt;font-family:"Courier New";color:#336BDD;mso-ligatures:none">void</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
<b><i>doSomething</i></b>() {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
</span><span style="font-size:9.0pt;font-family:"Courier New";color:#336BDD;mso-ligatures:none">try</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
{<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
Thread.<i>sleep</i>(1000);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
}
</span><span style="font-size:9.0pt;font-family:"Courier New";color:#336BDD;mso-ligatures:none">catch</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
(InterruptedException ignore) {}<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">}<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:#336BDD;mso-ligatures:none">void</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
<b>main</b>() {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
Thread.<i>ofVirtual</i>().start(() -> {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
</span><span style="font-size:9.0pt;font-family:"Courier New";color:#336BDD;mso-ligatures:none">while</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
(</span><span style="font-size:9.0pt;font-family:"Courier New";color:#336BDD;mso-ligatures:none">true</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">)
{<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
<i>doSomething</i>();<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
System.</span><i><span style="font-size:9.0pt;font-family:"Courier New";color:#CE54B8;mso-ligatures:none">out</span></i><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">.println(</span><span style="font-size:9.0pt;font-family:"Courier New";color:#1E9347;mso-ligatures:none">"I
do something until you press Enter"</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
}<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
});<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
Thread.<i>ofVirtual</i>().start(() -> {<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
</span><span style="font-size:9.0pt;font-family:"Courier New";color:#336BDD;mso-ligatures:none">while</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
(</span><span style="font-size:9.0pt;font-family:"Courier New";color:#336BDD;mso-ligatures:none">true</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">)
{<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
<i>doSomething</i>();<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
<i>println</i>(</span><span style="font-size:9.0pt;font-family:"Courier New";color:#1E9347;mso-ligatures:none">"I'm
blocked until you press Enter"</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
}<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
});<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">
<i>readln</i>(</span><span style="font-size:9.0pt;font-family:"Courier New";color:#1E9347;mso-ligatures:none">""</span><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">);<o:p></o:p></span></p>
<p class="MsoNormal" style="background:white"><span style="font-size:9.0pt;font-family:"Courier New";color:black;mso-ligatures:none">}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size:12.0pt;mso-ligatures:none"><o:p> </o:p></span></p>
</div>
</blockquote>
IO uses Console which has its own read + write locks to coordinate
input and output from concurrent threads. The readln is both output
(for the prompt) and input and it seems to hold both locks when
waiting for input. System.out has its own route to print the
output, doesn't coordinate with Console, so isn't locked out by
readln(prompt). It's always been possible to mix Console and
System.in/out, but maybe time to re-examine to avoid puzzlers when
mixing uses of the new textual I/O methods with code copied from a
book or online resource that uses System.out.<br>
<br>
-Alan<br>
</body>
</html>