- package com.abc.handoff;
- import com.abc.pp.stringhandoff.*;
- import com.programix.thread.*;
- //This program has multiple threads passing a string to other threads
- public class StringHandoffImpl implements StringHandoff {
- //String to hold the message to be passed
- private String message;
- public StringHandoffImpl() {
- //set the message to null to use it as a flag
- message = null;
- }
- //passing string calls this function
- @Override
- public synchronized void pass(String msg, long msTimeout)
- throws InterruptedException,
- TimedOutException,
- ShutdownException,
- IllegalStateException {
- //if message is null change the message
- if (message == null) {
- message = msg;
- notifyAll();
- }
- //wqait if message isn't null
- if (msTimeout == 0L) {
- while (message != null) {
- wait();
- }
- message = msg;
- notifyAll();
- }
- long endTime = System.currentTimeMillis() + msTimeout;
- long msRemaining = msTimeout;
- //Wait for a certain time, correcting for accuracy
- while (message != null && msRemaining > 0L) {
- wait(msRemaining);
- msRemaining = endTime - System.currentTimeMillis();
- }
- if (message == null) {
- message = msg;
- notifyAll();
- } else {
- throw new TimedOutException();
- }
- }
- //same as previous method with no timeout limitation
- @Override
- public synchronized void pass(String msg)
- throws InterruptedException,
- ShutdownException,
- IllegalStateException {
- while (message != null) {
- wait();
- }
- message = msg;
- notifyAll();
- }
- //Receiving thread's function
- @Override
- public synchronized String receive(long msTimeout)
- throws InterruptedException,
- TimedOutException,
- ShutdownException,
- IllegalStateException {
- //variable to hold passing message
- String receivedMessage;
- if (message != null) {
- //If message is not null recieve message change flag notify threads
- receivedMessage = message;
- message = null;
- notifyAll();
- return receivedMessage;
- }
- if (msTimeout == 0L) {
- while (message == null) {
- wait();
- }
- receivedMessage = message;
- message = null;
- notifyAll();
- return receivedMessage;
- }
- //wait if message isn't available correct for time
- long endTime = System.currentTimeMillis() + msTimeout;
- long msRemaining = msTimeout;
- while (message == null && msRemaining > 0L) {
- wait(msRemaining);
- msRemaining = endTime - System.currentTimeMillis();
- }
- if (message != null) {
- receivedMessage = message;
- message = null;
- notifyAll();
- return receivedMessage;
- }
- throw new TimedOutException();
- }
- //same method as above without the timeout limitation
- @Override
- public synchronized String receive()
- throws InterruptedException,
- ShutdownException,
- IllegalStateException {
- while (message == null) {
- wait();
- }
- String receivedMessage = message;
- message = null;
- notifyAll();
- return receivedMessage;
- }
- @Override
- public synchronized void shutdown() {
- throw new RuntimeException("not implemented yet"); // FIXME
- }
- @Override
- public Object getLockObject() {
- return this;
- }
- }