All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.zeromq.ZThread Maven / Gradle / Ivy

package org.zeromq;

import org.zeromq.ZMQ.Socket;

public class ZThread
{
    public static interface IAttachedRunnable
    {
        public void run (Object[] args, ZContext ctx, Socket pipe);
    }

    public static interface IDetachedRunnable
    {
        public void run (Object[] args);
    }

    private static class ShimThread extends Thread 
    {
        private ZContext ctx;
        private IAttachedRunnable attachedRunnable;
        private IDetachedRunnable detachedRunnable;
        private Object[] args;
        private Socket pipe;

        protected ShimThread (ZContext ctx, IAttachedRunnable runnable, Object [] args, Socket pipe)
        {
            assert (ctx != null);
            assert (pipe != null);
            assert (runnable != null);
            
            this.ctx = ctx;
            this.attachedRunnable = runnable;
            this.args = args;
            this.pipe = pipe;
        }
        
        public ShimThread (IDetachedRunnable runnable, Object[] args)
        {
            assert (runnable != null);
            this.detachedRunnable = runnable;
            this.args = args;
        }

        @Override
        public void run () 
        {
            if (attachedRunnable != null) {
                attachedRunnable.run (args, ctx, pipe);
                ctx.destroy ();
            } else
                detachedRunnable.run (args);
        }
    }
    
    //  --------------------------------------------------------------------------
    //  Create a detached thread. A detached thread operates autonomously
    //  and is used to simulate a separate process. It gets no ctx, and no
    //  pipe.
    
    public static void start (IDetachedRunnable runnable, Object ... args)
    {
        //  Prepare child thread
        Thread shim = new ShimThread (runnable, args);
        shim.start ();
    }
    
    //  --------------------------------------------------------------------------
    //  Create an attached thread. An attached thread gets a ctx and a PAIR
    //  pipe back to its parent. It must monitor its pipe, and exit if the
    //  pipe becomes unreadable. Returns pipe, or null if there was an error.
    
    public static Socket fork (ZContext ctx, IAttachedRunnable runnable, Object ... args)
    {
        Socket pipe = ctx.createSocket (ZMQ.PAIR);
        
        if (pipe != null) {
            pipe.bind (String.format ("inproc://zctx-pipe-%d", pipe.hashCode ()));
        } else {
            return null;
        }
        
        //  Connect child pipe to our pipe
        ZContext ccontext = ZContext.shadow (ctx);
        Socket cpipe = ccontext.createSocket (ZMQ.PAIR);
        if (cpipe == null)
            return null;
        cpipe.connect (String.format ("inproc://zctx-pipe-%d", pipe.hashCode ()));

        //  Prepare child thread
        Thread shim = new ShimThread (ccontext, runnable, args, cpipe);
        shim.start ();
        
        return pipe;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy