<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FWork_Thread_Pattern</id>
		<title>Java/Design Pattern/Work Thread Pattern - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2FDesign_Pattern%2FWork_Thread_Pattern"/>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Work_Thread_Pattern&amp;action=history"/>
		<updated>2026-04-06T15:33:02Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/Work_Thread_Pattern&amp;diff=7815&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Work_Thread_Pattern&amp;diff=7815&amp;oldid=prev"/>
				<updated>2010-06-01T06:50:51Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:50, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://jexp.ru/index.php?title=Java/Design_Pattern/Work_Thread_Pattern&amp;diff=7814&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://jexp.ru/index.php?title=Java/Design_Pattern/Work_Thread_Pattern&amp;diff=7814&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:45Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Worker Thread Pattern in Java ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- start source code --&amp;gt;&lt;br /&gt;
   &lt;br /&gt;
    &amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
//[C] 2002 Sun Microsystems, Inc.---&lt;br /&gt;
&lt;br /&gt;
import java.io.IOException;&lt;br /&gt;
import java.io.Serializable;&lt;br /&gt;
import java.rmi.Naming;&lt;br /&gt;
import java.rmi.Remote;&lt;br /&gt;
import java.rmi.RemoteException;&lt;br /&gt;
import java.rmi.server.UnicastRemoteObject;&lt;br /&gt;
import java.util.Vector;&lt;br /&gt;
public class RunWorkerThreadPattern {&lt;br /&gt;
  private static final String WORKER_SERVER_URL = &amp;quot;//localhost/workerThreadServer&amp;quot;;&lt;br /&gt;
  public static void main(String[] arguments) {&lt;br /&gt;
    System.out.println(&amp;quot;Example for the WorkerThread pattern&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;In this example, a ConcreteQueue object which uses a&amp;quot;);&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot; worker thread, will retrieve a number of objects from&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; the server.&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out.println(&amp;quot;Running the RMI compiler (rmic)&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    try {&lt;br /&gt;
      Process p1 = Runtime.getRuntime().exec(&amp;quot;rmic ServerDataStoreImpl&amp;quot;);&lt;br /&gt;
      p1.waitFor();&lt;br /&gt;
    } catch (IOException exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Unable to run rmic utility. Exiting application.&amp;quot;);&lt;br /&gt;
      System.exit(1);&lt;br /&gt;
    } catch (InterruptedException exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Threading problems encountered while using the rmic utility.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    System.out.println(&amp;quot;Starting the rmiregistry&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    Process rmiProcess = null;&lt;br /&gt;
    try {&lt;br /&gt;
      rmiProcess = Runtime.getRuntime().exec(&amp;quot;rmiregistry&amp;quot;);&lt;br /&gt;
      Thread.sleep(15000);&lt;br /&gt;
    } catch (IOException exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Unable to start the rmiregistry. Exiting application.&amp;quot;);&lt;br /&gt;
      System.exit(1);&lt;br /&gt;
    } catch (InterruptedException exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Threading problems encountered when starting the rmiregistry.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;Creating the queue, which will be managed by the worker thread&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    ConcreteQueue workQueue = new ConcreteQueue();&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;Creating the RMI server object, ServerDataStoreImpl&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    ServerDataStore server = new ServerDataStoreImpl();&lt;br /&gt;
    System.out.println(&amp;quot;Creating AddressRetrievers and ContactRetreivers.&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; These will placed in the queue, as tasks to be&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot; performed by the worker thread.&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    AddressRetriever firstAddr = new AddressRetriever(5280L,&lt;br /&gt;
        WORKER_SERVER_URL);&lt;br /&gt;
    AddressRetriever secondAddr = new AddressRetriever(2010L,&lt;br /&gt;
        WORKER_SERVER_URL);&lt;br /&gt;
    ContactRetriever firstContact = new ContactRetriever(5280L,&lt;br /&gt;
        WORKER_SERVER_URL);&lt;br /&gt;
    workQueue.put(firstAddr);&lt;br /&gt;
    workQueue.put(firstContact);&lt;br /&gt;
    workQueue.put(secondAddr);&lt;br /&gt;
    while (!secondAddr.isAddressAvailable()) {&lt;br /&gt;
      try {&lt;br /&gt;
        Thread.sleep(1000);&lt;br /&gt;
      } catch (InterruptedException exc) {&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    System.out&lt;br /&gt;
        .println(&amp;quot;WorkerThread completed the processing of its Tasks&amp;quot;);&lt;br /&gt;
    System.out.println(&amp;quot;Printing out the retrieved objects now:&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    System.out.println(firstAddr.getAddress());&lt;br /&gt;
    System.out.println(firstContact.getContact());&lt;br /&gt;
    System.out.println(secondAddr.getAddress());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface Address extends Serializable {&lt;br /&gt;
  public static final String EOL_STRING = System&lt;br /&gt;
      .getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
  public static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
  public static final String COMMA = &amp;quot;,&amp;quot;;&lt;br /&gt;
  public String getType();&lt;br /&gt;
  public String getDescription();&lt;br /&gt;
  public String getStreet();&lt;br /&gt;
  public String getCity();&lt;br /&gt;
  public String getState();&lt;br /&gt;
  public String getZipCode();&lt;br /&gt;
  public void setType(String newType);&lt;br /&gt;
  public void setDescription(String newDescription);&lt;br /&gt;
  public void setStreet(String newStreet);&lt;br /&gt;
  public void setCity(String newCity);&lt;br /&gt;
  public void setState(String newState);&lt;br /&gt;
  public void setZipCode(String newZip);&lt;br /&gt;
}&lt;br /&gt;
class AddressImpl implements Address {&lt;br /&gt;
  private String type;&lt;br /&gt;
  private String description;&lt;br /&gt;
  private String street;&lt;br /&gt;
  private String city;&lt;br /&gt;
  private String state;&lt;br /&gt;
  private String zipCode;&lt;br /&gt;
  public AddressImpl() {&lt;br /&gt;
  }&lt;br /&gt;
  public AddressImpl(String newDescription, String newStreet, String newCity,&lt;br /&gt;
      String newState, String newZipCode) {&lt;br /&gt;
    description = newDescription;&lt;br /&gt;
    street = newStreet;&lt;br /&gt;
    city = newCity;&lt;br /&gt;
    state = newState;&lt;br /&gt;
    zipCode = newZipCode;&lt;br /&gt;
  }&lt;br /&gt;
  public String getType() {&lt;br /&gt;
    return type;&lt;br /&gt;
  }&lt;br /&gt;
  public String getDescription() {&lt;br /&gt;
    return description;&lt;br /&gt;
  }&lt;br /&gt;
  public String getStreet() {&lt;br /&gt;
    return street;&lt;br /&gt;
  }&lt;br /&gt;
  public String getCity() {&lt;br /&gt;
    return city;&lt;br /&gt;
  }&lt;br /&gt;
  public String getState() {&lt;br /&gt;
    return state;&lt;br /&gt;
  }&lt;br /&gt;
  public String getZipCode() {&lt;br /&gt;
    return zipCode;&lt;br /&gt;
  }&lt;br /&gt;
  public void setType(String newType) {&lt;br /&gt;
    type = newType;&lt;br /&gt;
  }&lt;br /&gt;
  public void setDescription(String newDescription) {&lt;br /&gt;
    description = newDescription;&lt;br /&gt;
  }&lt;br /&gt;
  public void setStreet(String newStreet) {&lt;br /&gt;
    street = newStreet;&lt;br /&gt;
  }&lt;br /&gt;
  public void setCity(String newCity) {&lt;br /&gt;
    city = newCity;&lt;br /&gt;
  }&lt;br /&gt;
  public void setState(String newState) {&lt;br /&gt;
    state = newState;&lt;br /&gt;
  }&lt;br /&gt;
  public void setZipCode(String newZip) {&lt;br /&gt;
    zipCode = newZip;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return street + EOL_STRING + city + COMMA + SPACE + state + SPACE&lt;br /&gt;
        + zipCode + EOL_STRING;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class AddressRetriever implements RunnableTask {&lt;br /&gt;
  private Address address;&lt;br /&gt;
  private long addressID;&lt;br /&gt;
  private String url;&lt;br /&gt;
  public AddressRetriever(long newAddressID, String newUrl) {&lt;br /&gt;
    addressID = newAddressID;&lt;br /&gt;
    url = newUrl;&lt;br /&gt;
  }&lt;br /&gt;
  public void execute() {&lt;br /&gt;
    try {&lt;br /&gt;
      ServerDataStore dataStore = (ServerDataStore) Naming.lookup(url);&lt;br /&gt;
      address = dataStore.retrieveAddress(addressID);&lt;br /&gt;
    } catch (Exception exc) {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public Address getAddress() {&lt;br /&gt;
    return address;&lt;br /&gt;
  }&lt;br /&gt;
  public boolean isAddressAvailable() {&lt;br /&gt;
    return (address == null) ? false : true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class ConcreteQueue implements Queue {&lt;br /&gt;
  private Vector tasks = new Vector();&lt;br /&gt;
  private boolean waiting;&lt;br /&gt;
  private boolean shutdown;&lt;br /&gt;
  public void setShutdown(boolean isShutdown) {&lt;br /&gt;
    shutdown = isShutdown;&lt;br /&gt;
  }&lt;br /&gt;
  public ConcreteQueue() {&lt;br /&gt;
    tasks = new Vector();&lt;br /&gt;
    waiting = false;&lt;br /&gt;
    new Thread(new Worker()).start();&lt;br /&gt;
  }&lt;br /&gt;
  public void put(RunnableTask r) {&lt;br /&gt;
    tasks.add(r);&lt;br /&gt;
    if (waiting) {&lt;br /&gt;
      synchronized (this) {&lt;br /&gt;
        notifyAll();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public RunnableTask take() {&lt;br /&gt;
    if (tasks.isEmpty()) {&lt;br /&gt;
      synchronized (this) {&lt;br /&gt;
        waiting = true;&lt;br /&gt;
        try {&lt;br /&gt;
          wait();&lt;br /&gt;
        } catch (InterruptedException ie) {&lt;br /&gt;
          waiting = false;&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    return (RunnableTask) tasks.remove(0);&lt;br /&gt;
  }&lt;br /&gt;
  private class Worker implements Runnable {&lt;br /&gt;
    public void run() {&lt;br /&gt;
      while (!shutdown) {&lt;br /&gt;
        RunnableTask r = take();&lt;br /&gt;
        r.execute();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface Contact extends Serializable {&lt;br /&gt;
  public static final String EOL_STRING = System&lt;br /&gt;
      .getProperty(&amp;quot;line.separator&amp;quot;);&lt;br /&gt;
  public static final String SPACE = &amp;quot; &amp;quot;;&lt;br /&gt;
  public String getFirstName();&lt;br /&gt;
  public String getLastName();&lt;br /&gt;
  public String getTitle();&lt;br /&gt;
  public String getOrganization();&lt;br /&gt;
  public void setFirstName(String newFirstName);&lt;br /&gt;
  public void setLastName(String newLastName);&lt;br /&gt;
  public void setTitle(String newTitle);&lt;br /&gt;
  public void setOrganization(String newOrganization);&lt;br /&gt;
}&lt;br /&gt;
class ContactImpl implements Contact {&lt;br /&gt;
  private String firstName;&lt;br /&gt;
  private String lastName;&lt;br /&gt;
  private String title;&lt;br /&gt;
  private String organization;&lt;br /&gt;
  public ContactImpl() {&lt;br /&gt;
  }&lt;br /&gt;
  public ContactImpl(String newFirstName, String newLastName,&lt;br /&gt;
      String newTitle, String newOrganization) {&lt;br /&gt;
    firstName = newFirstName;&lt;br /&gt;
    lastName = newLastName;&lt;br /&gt;
    title = newTitle;&lt;br /&gt;
    organization = newOrganization;&lt;br /&gt;
  }&lt;br /&gt;
  public String getFirstName() {&lt;br /&gt;
    return firstName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getLastName() {&lt;br /&gt;
    return lastName;&lt;br /&gt;
  }&lt;br /&gt;
  public String getTitle() {&lt;br /&gt;
    return title;&lt;br /&gt;
  }&lt;br /&gt;
  public String getOrganization() {&lt;br /&gt;
    return organization;&lt;br /&gt;
  }&lt;br /&gt;
  public void setFirstName(String newFirstName) {&lt;br /&gt;
    firstName = newFirstName;&lt;br /&gt;
  }&lt;br /&gt;
  public void setLastName(String newLastName) {&lt;br /&gt;
    lastName = newLastName;&lt;br /&gt;
  }&lt;br /&gt;
  public void setTitle(String newTitle) {&lt;br /&gt;
    title = newTitle;&lt;br /&gt;
  }&lt;br /&gt;
  public void setOrganization(String newOrganization) {&lt;br /&gt;
    organization = newOrganization;&lt;br /&gt;
  }&lt;br /&gt;
  public String toString() {&lt;br /&gt;
    return firstName + SPACE + lastName + EOL_STRING;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class ContactRetriever implements RunnableTask {&lt;br /&gt;
  private Contact contact;&lt;br /&gt;
  private long contactID;&lt;br /&gt;
  private String url;&lt;br /&gt;
  public ContactRetriever(long newContactID, String newUrl) {&lt;br /&gt;
    contactID = newContactID;&lt;br /&gt;
    url = newUrl;&lt;br /&gt;
  }&lt;br /&gt;
  public void execute() {&lt;br /&gt;
    try {&lt;br /&gt;
      ServerDataStore dataStore = (ServerDataStore) Naming.lookup(url);&lt;br /&gt;
      contact = dataStore.retrieveContact(contactID);&lt;br /&gt;
    } catch (Exception exc) {&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public Contact getContact() {&lt;br /&gt;
    return contact;&lt;br /&gt;
  }&lt;br /&gt;
  public boolean isContactAvailable() {&lt;br /&gt;
    return (contact == null) ? false : true;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
interface Queue {&lt;br /&gt;
  void put(RunnableTask r);&lt;br /&gt;
  RunnableTask take();&lt;br /&gt;
}&lt;br /&gt;
interface RunnableTask {&lt;br /&gt;
  public void execute();&lt;br /&gt;
}&lt;br /&gt;
interface ServerDataStore extends Remote {&lt;br /&gt;
  public Address retrieveAddress(long addressID) throws RemoteException;&lt;br /&gt;
  public Contact retrieveContact(long contactID) throws RemoteException;&lt;br /&gt;
}&lt;br /&gt;
class ServerDataStoreImpl implements ServerDataStore {&lt;br /&gt;
  private static final String WORKER_SERVER_SERVICE_NAME = &amp;quot;workerThreadServer&amp;quot;;&lt;br /&gt;
  public ServerDataStoreImpl() {&lt;br /&gt;
    try {&lt;br /&gt;
      UnicastRemoteObject.exportObject(this);&lt;br /&gt;
      Naming.rebind(WORKER_SERVER_SERVICE_NAME, this);&lt;br /&gt;
    } catch (Exception exc) {&lt;br /&gt;
      System.err&lt;br /&gt;
          .println(&amp;quot;Error using RMI to register the ServerDataStoreImpl &amp;quot;&lt;br /&gt;
              + exc);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public Address retrieveAddress(long addressID) {&lt;br /&gt;
    if (addressID == 5280L) {&lt;br /&gt;
      return new AddressImpl(&amp;quot;Fine Dining&amp;quot;, &amp;quot;416 Chartres St.&amp;quot;,&lt;br /&gt;
          &amp;quot;New Orleans&amp;quot;, &amp;quot;LA&amp;quot;, &amp;quot;51720&amp;quot;);&lt;br /&gt;
    } else if (addressID == 2010L) {&lt;br /&gt;
      return new AddressImpl(&amp;quot;Mystic Yacht Club&amp;quot;, &amp;quot;19 Imaginary Lane&amp;quot;,&lt;br /&gt;
          &amp;quot;Mystic&amp;quot;, &amp;quot;CT&amp;quot;, &amp;quot;46802&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      return new AddressImpl();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public Contact retrieveContact(long contactID) {&lt;br /&gt;
    if (contactID == 5280L) {&lt;br /&gt;
      return new ContactImpl(&amp;quot;Dwayne&amp;quot;, &amp;quot;Dibley&amp;quot;, &amp;quot;Accountant&amp;quot;, &amp;quot;Virtucon&amp;quot;);&lt;br /&gt;
    } else {&lt;br /&gt;
      return new ContactImpl();&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
           &lt;br /&gt;
       &amp;lt;/source&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
   &lt;br /&gt;
  &amp;lt;!-- end source code --&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>