Note that there are some explanatory texts on larger screens.

plurals
  1. POHow is this java app running multiple threads without extending threads or implementing runnable?
    primarykey
    data
    text
    <p>I'm learning Java and was able to do a bit of multi-threading with my existing apps using runnable. I was now looking at disruptor(to share variables between threads), but I can't figure out how the author is actually spawning threads.</p> <p>I see he is using Executor, which I use to submit runnable classes to in my program but in this example there is no submit(or runnable). I only learned what I know from the Oracle tutorials and they mention the only two ways is to extend threads or implement runnable(I don't see either here, but he does submit executor to disruptor, which maybe how he's threading?). Am I missing something or is this person doing it in a different way? My end goal is to understand this code(which works perfectly) so I can apply it to my existing (using runnable) code.</p> <p>Here's the code in question:</p> <p><a href="http://www.kotancode.com/2012/01/06/hello-disruptor/" rel="nofollow">App.java</a></p> <pre><code>import com.lmax.disruptor.*; import com.lmax.disruptor.dsl.*; import java.util.concurrent.Executor; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadPoolExecutor; public class App { private final static int RING_SIZE = 1024 * 8; private static long handleCount = 0; private final static long ITERATIONS = 1000L * 1000L * 300L; private final static int NUM_EVENT_PROCESSORS = 8; private final static EventHandler&lt;ValueEvent&gt; handler = new EventHandler&lt;ValueEvent&gt;() { public void onEvent(final ValueEvent event, final long sequence, final boolean endOfBatch) throws Exception { handleCount++; } }; public static void main(String[] args) { System.out.println("Starting disruptor app."); ExecutorService executor = Executors.newFixedThreadPool(NUM_EVENT_PROCESSORS); Disruptor&lt;ValueEvent&gt; disruptor = new Disruptor&lt;ValueEvent&gt;(ValueEvent.EVENT_FACTORY, executor, new SingleThreadedClaimStrategy(RING_SIZE), new SleepingWaitStrategy()); disruptor.handleEventsWith(handler); RingBuffer&lt;ValueEvent&gt; ringBuffer = disruptor.start(); long start = System.currentTimeMillis(); long sequence; ValueEvent event; for (long x=0; x&lt;ITERATIONS; x++) { sequence = ringBuffer.next(); event = ringBuffer.get(sequence); event.setValue(x); ringBuffer.publish(sequence); } final long expectedSequence = ringBuffer.getCursor(); while (handleCount &lt; expectedSequence) { } long opsPerSecond = (ITERATIONS * 1000L) / (System.currentTimeMillis() - start); System.out.printf("op/s: %d, handled: %d", opsPerSecond, handleCount); } } </code></pre> <p>Update: if Disruptor is handling the spawning of threads then how can I submit my existing runnable class to it? or do I need to rework the code again? Sorry I'm a bit confused on if disruptor is going to work with existing code or if I need to completely change my stuff for it.</p>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload