⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 workqueue.htm

📁 这个压缩包里的都是超级经典的java例子
💻 HTM
字号:
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<TITLE>Implementing an Unbounded Work Queue (Java Developers Almanac Example)
</TITLE>
<META CONTENT="Patrick Chan" NAME="AUTHOR">
<META CONTENT="Code Examples from The Java Developers Almanac 1.4" NAME="DESCRIPTION">
<META CONTENT="Addison-Wesley/Patrick Chan" NAME="OWNER">
<META CONTENT="3/20/02" NAME="revision">
<META CONTENT="no-cache" HTTP-EQUIV="Pragma">
<LINK href="/almanac.css" media="screen" type="text/css" rel="stylesheet">
</HEAD>
<BODY>
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0">
<TR>
<TD></TD>
</TR>
</TABLE>
<br>
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0">
<TR>
<TD></TD>
</TR>
<TR>
<TD rowspan="3"><A HREF="/?l=ex"><IMG BORDER="0" ALIGN="BOTTOM" HSPACE="10" SRC="/egs/almanac14a.jpg"></A></TD><TD VALIGN="top">
<h1>The Java Developers Almanac 1.4</h1>
<br>
        Order this book from <a href="/cgi-bin/scripts/redirect.pl?l=ex&url=http://www.amazon.com/exec/obidos/ASIN/0201752808/xeo">Amazon</a>.
    </TD>
</TR>
<TR>
<TD align="right" valign="bottom">
<FORM method="get" action="/cgi-bin/search/find.pl">
<INPUT size="25" name="words" type="text"><INPUT value="Search" type="submit">
</FORM>
</TD>
</TR>
</TABLE>
<HR color="#6666cc">
<TABLE CELLSPACING="0" CELLPADDING="0" BORDER="0">
<TR>
<TD valign="top"><script type="text/javascript">
<!--
google_ad_client = "pub-6001183370374757";
google_ad_width = 120;
google_ad_height = 600;
google_ad_format = "120x600_as";
google_ad_channel = "4777242811";
google_ad_type = "text_image";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "6666CC";
google_color_url = "6666CC";
google_color_text = "000000";
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD valign="top">
<DIV ALIGN="LEFT">
<A HREF="/">Home</A>
    &gt;
    <A HREF="../index.html">List of Packages</A>
    &gt;

    
    <A HREF="../java.lang/pkg.html">java.lang</A><font color="#666666" class="xsmall-font">
        &nbsp;[59 examples]
    </font>
        &gt;
        <B><A HREF="../java.lang/pkg.html#Threads">Threads</A></B><font color="#666666" class="xsmall-font">
            &nbsp;[12 examples]
            </font>
</DIV><P>
  <h3>e102. Implementing an Unbounded Work Queue</h3>

A work queue is used to coordinate work between a <font color="#0066ff"><i>producer</i></font> and
a set of worker threads.  When some work needs to be performed, the
producer adds an object containing the work information to the work
queue.  One of the worker threads then removes the object from the
work queue and acts upon the information.  If the queue is empty, a
worker thread will block until a new object is added to the queue.

<P> This example declares a class that implements an unbounded work
queue using a linked list.

<pre>    public class WorkQueue {
        LinkedList queue = new LinkedList();
    
        // Add work to the work queue
        public synchronized void addWork(Object o) {
            queue.addLast(o);
            notify();
        }
    
        // Retrieve work from the work queue; block if the queue is empty
        public synchronized Object getWork() throws InterruptedException {
            while (queue.isEmpty()) {
                wait();
            }
            return queue.removeFirst();
        }
    }
</pre>
Here's an example that uses the <code>WorkQueue</code> class.
The workers in this example retrieve <code>Integer</code> objects
from the work queue and square the values.

<pre>    // Create the work queue
    WorkQueue queue = new WorkQueue();
    
    // Create a set of worker threads
    final int numWorkers = <font color="#0066ff"><i>2</i></font>;
    Worker[] workers = new Worker[numWorkers];
    for (int i=0; i&lt;workers.length; i++) {
        workers[i] = new Worker(queue);
        workers[i].start();
    }
    
    // Add some work to the queue; block if the queue is full.
    // Note that null cannot be added to a blocking queue.
    for (int i=0; i&lt;100; i++) {
        queue.addWork(i);
    }
    
    // Add special end-of-stream markers to terminate the workers
    for (int i=0; i&lt;workers.length; i++) {
        queue.addWork(Worker.NO_MORE_WORK);
    }
</pre>
This worker thread removes an integer from the work queue and
calculates its square.

<pre>    class Worker extends Thread {
        // Special end-of-stream marker. If a worker retrieves
        // an Integer that equals this marker, the worker will terminate.
        static final Object NO_MORE_WORK = new Object();
    
        WorkQueue q;
    
        Worker(WorkQueue q) {
            this.q = q;
        }
        public void run() {
            try {
                while (true) {
                    // Retrieve some work; block if the queue is empty
                    Object x = q.getWork();
    
                    // Terminate if the end-of-stream marker was retrieved
                    if (x == NO_MORE_WORK) {
                        break;
                    }
    
                    // Compute the square of x
                    int y = ((Integer)x).intValue() * ((Integer)x).intValue();
                }
            } catch (InterruptedException e) {
            }
        }
    }
</pre>
In J2SE 5.0, use a <code>BoundedQueue</code> to implement an unbounded work
queue. See <a href="../java.lang/FixedWorkQueue.html" class="eglink"><b>e1073</b> Creating a Bounded Work Queue [5.0]</a> for an example;
construct the <code>ArrayBoundedQueue</code> without a capacity.


<P><table width="600" CELLSPACING="0" CELLPADDING="2" BORDER="0">
<tr>
<td bgcolor="#6666cc" align="center"><font color="#ffffff">
            &nbsp;<b>Related Examples</b></font></td>
</tr>
</table>


e92. <a class="eglink" href="BasicThread.html?l=rel">
    Creating a Thread
</a>
<br>

e93. <a class="eglink" href="StopThread.html?l=rel">
    Stopping a Thread
</a>
<br>

e94. <a class="eglink" href="IfStopped.html?l=rel">
    Determining When a Thread Has Finished
</a>
<br>

e95. <a class="eglink" href="Sleep.html?l=rel">
    Pausing the Current Thread
</a>
<br>

e96. <a class="eglink" href="PauseThread.html?l=rel">
    Pausing a Thread
</a>
<br>

e97. <a class="eglink" href="IfLocked.html?l=rel">
    Determining If the Current Thread Is Holding a Synchronized Lock
</a>
<br>

e98. <a class="eglink" href="DaemonThread.html?l=rel">
    Allowing an Application with Live Threads to Exit
</a>
<br>

e99. <a class="eglink" href="ListThreads.html?l=rel">
    Listing All Running Threads
</a>
<br>

e100. <a class="eglink" href="TLocal.html?l=rel">
    Using a Thread-Local Variable
</a>
<br>

e101. <a class="eglink" href="GetStack.html?l=rel">
    Getting the Stack Trace of an Exception
</a>
<br>

e1073. <a class="eglink" href="FixedWorkQueue.html?l=rel">
    Creating a Bounded Work Queue [5.0]
</a>
<br>


<table width="600" CELLSPACING="0" CELLPADDING="2" BORDER="0">
<tr>
<td align="left">
<br>
        See also: 
<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Arrays">
    Arrays
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Assertions">
    Assertions
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Classes">
    Classes
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Commands">
    Commands
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Numbers">
    Numbers
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Objects">
    Objects
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#Strings">
    Strings
</a>&nbsp;&nbsp;

<a class="eglink" href="/egs/java.lang/pkg.html?l=rel#System%20Properties">
    System Properties
</a>&nbsp;&nbsp;

</td>
</tr>
</table>

<br>

<br>
<FONT class="xsmall-font">
&copy; 2002 Addison-Wesley.
</FONT></TD><TD>&nbsp;&nbsp;&nbsp;</TD><TD valign="top"><A href="http://compositesw.com/devzone?ref=javaalmanac"><IMG alt="Click Here" height="600" width="120" border="0" src="/csw_oad_120x600_final.gif"></A></TD>
</TR>
</TABLE>
</BODY>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META CONTENT="NO-CACHE" HTTP-EQUIV="PRAGMA">
</HEAD>
</HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -