Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use Callable with void return type?

I am working on a project in which I have multiple interface and two Implementations classes which needs to implement these two interfaces.

Suppose my first Interface is -

public Interface interfaceA {     public void abc() throws Exception; } 

And its implementation is -

public class TestA implements interfaceA {  // abc method } 

I am calling it like this -

TestA testA = new TestA(); testA.abc(); 

Now my second interface is -

public Interface interfaceB {     public void xyz() throws Exception; } 

And its implementation is -

public class TestB implements interfaceB {  // xyz method    } 

I am calling it like this -

TestB testB = new TestB(); testB.xyz(); 

Problem Statement:-

Now my question is - Is there any way, I can execute these two implementation classes in parallel? I don't want to run it in sequential.

Meaning, I want to run TestA and TestB implementation in parallel? Is this possible to do?

I was thinking to use Callable here but not sure how to use Callable with void return type here -

Let's use TestB class as an example:

public interface interfaceB {     public void xyz() throws Exception; }  public class TestB implements interfaceB, Callable<?>{      @Override     public void xyz() throws Exception     {         //do something      }      @Override     public void call() throws Exception     {         xyz();     } } 

Above code gives compilation error..

UPDATE:-

It looks like lot of people are suggesting to use Runnable instead of callable. But not sure how do I use Runnable here so that I can execute TestA and TestB in parallel.

like image 983
AKIWEB Avatar asked Apr 01 '14 19:04

AKIWEB


People also ask

Can Callable return null?

Overview. callable() is a static method of the Executors class that returns a Callable . When called, it runs the passed Runnable task and returns null .

What if the return type is void?

So what am I supposed to return if the return type of a function has to be Void ? Use return null . Void can't be instantiated and is merely a placeholder for the Class<T> type of void .

Can Callable return a value?

A Callable is similar to Runnable except that it can return a result and throw a checked exception.


Video Answer


2 Answers

You can use java.lang.Thread for parallel execution. However, in most cases it's easier to use an java.util.concurrent.ExecutorService. The latter provides a method to submit a Callable and returns a Future to get the result later (or wait for completion).

If testA.abc() and testB.xyz() should be executed in parallel, you use the ExecutorService to execute the former in a separate thread whereas the latter is executed in the original thread. Then you wait for the completion of the former for synchronization.

ExecutorService executor = ... // e.g. Executors.newFixedThreadPool(4);  Future<Void> future = executor.submit(new Callable<Void>() {     public Void call() throws Exception {         testA.abc();         return null;     } }); testB.xyz(); future.get(); // wait for completion of testA.abc() 
like image 122
nosid Avatar answered Sep 16 '22 16:09

nosid


Why would you need a void for running something in Parallel? For one, if you don't need the return value, you can simply return null.

To make something parallel you need to use threading/scheduling. I would personally recommend avoiding Callables, and using Runnables instead (and hey, no return value).

like image 31
Rogue Avatar answered Sep 16 '22 16:09

Rogue