HOME PCB
..MessageFactory.javaMessageService.javaMessageSession.javaMessageSessionImpl.javaQueueSendingThread.javaReceivingThread.javaSendObject.javaSendingThread.javaStandardReceivingThread.java
package Communication.Messages.Service;

public abstract class MessageService
{
    private Receiver receiver;
    private Sender sender;

    protected MessageService()
    {
    }

    protected abstract Receiver startReceiver();

    protected abstract Sender startSender();

    public final Receiver getReceiver()
    {
        return this.receiver;
    }

    public final Sender getSender()
    {
        return this.sender;
    }

    public final void start()
    {
        this.receiver = this.startReceiver();

        if (this.receiver != null && this.receiver.getState() == Thread.State.NEW)
        {
            this.receiver.start();
        }

        this.sender = this.startSender();

        if (this.sender != null && this.sender.getState() == Thread.State.NEW)
        {
            this.sender.start();
        }
    }

    public final void kill()
    {
        if (this.receiver != null && this.receiver.isAlive())
        {
            this.receiver.interrupt();
        }

        if (this.sender != null && this.sender.isAlive())
        {
            this.sender.interrupt();
        }
    }

    public boolean isAlive()
    {
        return (this.receiver != null && this.receiver.isAlive()) || (this.sender != null && this.sender.isAlive());
    }

    public void join() throws InterruptedException
    {
        if (this.receiver != null && this.receiver.isAlive())
        {
            this.receiver.join();
        }

        if (this.sender != null && this.sender.isAlive())
        {
            this.sender.join();
        }
    }

    @Override
    protected void finalize() throws Throwable
    {
        this.kill();

        super.finalize();
    }
}