<div dir="ltr"><div>To take it a little bit further, you could also say there are physical desks/counters where the tellers are supposed to work. And the number of desks/counters is usually less than the number of tellers. Here the desks/counters are the actual CPU cores. Since not all tellers will get a desk at the same time, the manager (the OS) will sometimes ask a teller to release a desk and allow another teller with some pending customers to serve at the desk. This swap sometimes happens if a certain teller has occupied a desk for a length of time and some other teller hasn't had a chance to serve its pending customers. This is analogous to platform thread scheduling by the OS on the actual cores.<br></div><div><br></div><div>Much simplified, but helped me create a mental model.</div><div><br></div><div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Regards<br></div><div>Swaranga</div></div></div></div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 19, 2022 at 12:13 PM Bazlur Rahman <<a href="mailto:anmbrr.bit0112@gmail.com">anmbrr.bit0112@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Hey Eric,<br><br><div>A great analogy, I wonder if I can use it in my talk at the PhillyJUG (of course, using your reference) today.<br><br clear="all"><div><div dir="ltr"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><font face="trebuchet ms, sans-serif"><b>Thank you,</b></font></div><div dir="ltr"><font face="trebuchet ms, sans-serif"><b>-</b></font></div><div dir="ltr"><font face="trebuchet ms, sans-serif"><b>A N M Bazlur Rahman</b></font></div><div dir="ltr"><br></div><div><br></div></div></div></div></div></div></div></div></div></div></div></div><br></div></div><br><img alt="" style="display: flex;" src="https://mailtrack.io/trace/mail/2dbbc76aa7e31276a04904dced68fe2ad6410e93.png?u=2428395" width="0" height="0"><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jul 19, 2022 at 2:34 PM <<a href="mailto:eric@kolotyluk.net" target="_blank">eric@kolotyluk.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-CA"><div><p class="MsoNormal"><span lang="EN-US">I am hoping this is an apt analogy, so please correct me if it is wrong…<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US">Before Loom, concurrency was like going to a bank with a fixed number of tellers, where each teller had a line of customers.<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p><ol style="margin-top:0cm" type="1" start="1"><li style="margin-left:0cm"><span lang="EN-US">In Java terms, a teller is like Platform Thread<u></u><u></u></span></li><li style="margin-left:0cm"><span lang="EN-US">Generally, it would take time to process each customer, say an average of 5 minutes<u></u><u></u></span></li><li style="margin-left:0cm"><span lang="EN-US">Sometimes, a customer would block the process, such as the teller needed to make a phone call to get some information<u></u><u></u></span></li><li style="margin-left:0cm"><span lang="EN-US">No work is performed, while the teller is blocked waiting, and consequently the entire line is blocked<u></u><u></u></span></li></ol><p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US">After Loom, concurrency is like going to a bank with more modern policies and procedures<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p><ol style="margin-top:0cm" type="1" start="1"><li style="margin-left:0cm"><span lang="EN-US">In Java terms, a teller is still like a Platform Thread, but has the ability to park a customer<u></u><u></u></span></li><li style="margin-left:0cm"><span lang="EN-US">Generally, it still takes time to process each customer, say an average of 5 minutes<u></u><u></u></span></li><li style="margin-left:0cm"><span lang="EN-US">Sometimes, a customer would block the process, such as the teller needed some information before proceeding…<u></u><u></u></span></li><ol style="margin-top:0cm" type="a" start="1"><li style="margin-left:0cm"><span lang="EN-US">The teller sends a text message or emails to get the necessary information<u></u><u></u></span></li><li style="margin-left:0cm"><span lang="EN-US">The teller asks the customer to be seated, and as soon the information is available, they will be the next customer processed by the first available teller<u></u><u></u></span></li><li style="margin-left:0cm"><span lang="EN-US">The teller starts processing the next customer in line<u></u><u></u></span></li><li style="margin-left:0cm"><span lang="EN-US">This is analogous to a parked Virtual Thread, where the teller is like a Platform Thread, and the customer is like a Virtual Thread<u></u><u></u></span></li></ol><li style="margin-left:0cm"><span lang="EN-US">Concurrency is increased, by better policies and procedures in dealing with blocking operations<u></u><u></u></span></li></ol><p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US">Yes, this is very simplistic, but intentionally so to try to expose what is so great about Virtual Threads.<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US">Cheers, Eric<u></u><u></u></span></p><p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p><p class="MsoNormal"><span lang="EN-US"><u></u> <u></u></span></p></div></div></blockquote></div></div>
</blockquote></div>