blob: bf082762cc7398aaffae20675f299ef9e1fb21e3 [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (11.0.18) on Wed Mar 01 02:01:42 GMT 2023 -->
<title>WakeableLooper (Heron Java API)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="dc.created" content="2023-03-01">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery/jquery-ui.min.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery-ui.overrides.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../jquery/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../../../../../jquery/jquery-ui.min.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="WakeableLooper (Heron Java API)";
}
}
catch(err) {
}
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":6,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":6};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">org.apache.heron.common.basics</a></div>
<h2 title="Class WakeableLooper" class="title">Class WakeableLooper</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.apache.heron.common.basics.WakeableLooper</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>Direct Known Subclasses:</dt>
<dd><code><a href="ExecutorLooper.html" title="class in org.apache.heron.common.basics">ExecutorLooper</a></code>, <code><a href="NIOLooper.html" title="class in org.apache.heron.common.basics">NIOLooper</a></code></dd>
</dl>
<hr>
<pre>public abstract class <span class="typeNameLabel">WakeableLooper</span>
extends java.lang.Object</pre>
<div class="block">A WakeableLooper is a class that could:
Block the thread when doWait() is called and unblock
when the wakeUp() is called or the waiting time exceeds the timeout.
It could execute timer event
<p>
The WakeableLooper will execute in a while loop unless the exitLoop() is called. And in every
execution, it will execute runOnce(), which will:
1. doWait(), which in fact is implemented by selector.select(timeout), and it will be wake up if other threads
wake it up, it meets the timeout, one channel is selected, or the current thread is interrupted.
2. run executeTasksOnWakeup(), which is a list of Runnable, e.g. tasks added to run every time. We could add tasks
even during executionTasksOnWakeup, but the task added will be executed next time we run executeTasksOnwakeup().
Notice: you could just add tasks into it but not remove tasks from it.
3. trigger the timers, which is a priority queue of <code>TimerTask</code>, the <code>TimerTask</code>
will be removed after execution.
<p>
So to use this class, user could add the persistent tasks, one time tasks and timer tasks as many
as they want.
Most methods except the onExit() are not thread-safe.
People should handle the concurrent scenarios in their business logic rather than in this class.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E()">WakeableLooper</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t3" class="tableTab"><span><a href="javascript:show(4);">Abstract Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#addTasksOnExit(java.lang.Runnable)">addTasksOnExit</a></span>&#8203;(java.lang.Runnable&nbsp;task)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#addTasksOnWakeup(java.lang.Runnable)">addTasksOnWakeup</a></span>&#8203;(java.lang.Runnable&nbsp;task)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#clear()">clear</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#clearExitTasks()">clearExitTasks</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#clearTasksOnWakeup()">clearTasksOnWakeup</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#clearTimers()">clearTimers</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i6" class="altColor">
<td class="colFirst"><code>protected abstract void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#doWait()">doWait</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i7" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#exitLoop()">exitLoop</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i8" class="altColor">
<td class="colFirst"><code>protected java.time.Duration</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getNextTimeoutInterval()">getNextTimeoutInterval</a></span>()</code></th>
<td class="colLast">
<div class="block">Get the timeout which should be used in doWait().</div>
</td>
</tr>
<tr id="i9" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#loop()">loop</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i10" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#registerPeriodicEvent(java.time.Duration,java.lang.Runnable)">registerPeriodicEvent</a></span>&#8203;(java.time.Duration&nbsp;frequency,
java.lang.Runnable&nbsp;task)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i11" class="rowColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#registerTimerEvent(java.time.Duration,java.lang.Runnable)">registerTimerEvent</a></span>&#8203;(java.time.Duration&nbsp;timerDuration,
java.lang.Runnable&nbsp;task)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i12" class="altColor">
<td class="colFirst"><code>abstract void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#wakeUp()">wakeUp</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a id="&lt;init&gt;()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>WakeableLooper</h4>
<pre>public&nbsp;WakeableLooper()</pre>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="clear()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>clear</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;clear()</pre>
</li>
</ul>
<a id="clearTasksOnWakeup()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>clearTasksOnWakeup</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;clearTasksOnWakeup()</pre>
</li>
</ul>
<a id="clearTimers()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>clearTimers</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;clearTimers()</pre>
</li>
</ul>
<a id="clearExitTasks()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>clearExitTasks</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;clearExitTasks()</pre>
</li>
</ul>
<a id="loop()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>loop</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;loop()</pre>
</li>
</ul>
<a id="doWait()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>doWait</h4>
<pre class="methodSignature">protected abstract&nbsp;void&nbsp;doWait()</pre>
</li>
</ul>
<a id="wakeUp()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>wakeUp</h4>
<pre class="methodSignature">public abstract&nbsp;void&nbsp;wakeUp()</pre>
</li>
</ul>
<a id="addTasksOnWakeup(java.lang.Runnable)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>addTasksOnWakeup</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;addTasksOnWakeup&#8203;(java.lang.Runnable&nbsp;task)</pre>
</li>
</ul>
<a id="addTasksOnExit(java.lang.Runnable)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>addTasksOnExit</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;addTasksOnExit&#8203;(java.lang.Runnable&nbsp;task)</pre>
</li>
</ul>
<a id="registerTimerEvent(java.time.Duration,java.lang.Runnable)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>registerTimerEvent</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;registerTimerEvent&#8203;(java.time.Duration&nbsp;timerDuration,
java.lang.Runnable&nbsp;task)</pre>
</li>
</ul>
<a id="registerPeriodicEvent(java.time.Duration,java.lang.Runnable)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>registerPeriodicEvent</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;registerPeriodicEvent&#8203;(java.time.Duration&nbsp;frequency,
java.lang.Runnable&nbsp;task)</pre>
</li>
</ul>
<a id="exitLoop()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>exitLoop</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;exitLoop()</pre>
</li>
</ul>
<a id="getNextTimeoutInterval()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>getNextTimeoutInterval</h4>
<pre class="methodSignature">protected&nbsp;java.time.Duration&nbsp;getNextTimeoutInterval()</pre>
<div class="block">Get the timeout which should be used in doWait().</div>
<dl>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>INFINITE_FUTURE : if there are no timer events
or the time to next timer event in milli-second</dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
</footer>
</body>
</html>