возвращаемые значения из threadExecutor - PullRequest
0 голосов
/ 13 марта 2012

Как получить доступ к методу getOptimizedMol () в фиксированном ThreadExecutor? Мне нужно получить возврат молекул, когда заканчивается каждый поток оптимизатора?

import chemaxon.marvin.calculations.ConformerPlugin;
import chemaxon.marvin.plugin.PluginException;
import chemaxon.struc.Molecule;

public class Optimizer3D implements Runnable {


    private Molecule mol3D;
    private Molecule mol2D;

    Optimizer3D(Molecule mol2D_)
    {
       this.mol2D = mol2D_; 
    }

    @Override
    public void run() {
        mol3D = chemAxonOptimizer();
    }

    private Molecule chemAxonOptimizer()
    {
        //optimize molecule code not shown
        return molecule;

    }


    public Molecule getOptimizedMol()
    {
        return mol3D;
    }
}

Ответы [ 3 ]

1 голос
/ 13 марта 2012

Вам нужно Callable, а не Runnable.Callable возвращает ваш результат.

Вы можете получить его следующим образом:

Future<YourExpectedResult> future = executor.submit(new YourCallable());
YourExpectedResult result = future.get();
1 голос
/ 13 марта 2012

Один из простых способов - добавить в ваш Runnable какой-нибудь JobListener:

public class Optimizer3D implements Runnable {

    public static interface JobListener {
         public void onJobFinished(Optimizer3D job);
    }

    private Molecule mol3D;
    private Molecule mol2D;
    private JobListener jobListener;
    Optimizer3D(Molecule mol2D_, JobListener listener)
    {
       this.mol2D = mol2D_; 
       this.jobListener = listener;
    }

    @Override
    public void run() {
        mol3D = chemAxonOptimizer();
        if (jobListener!=null) {
            jobListener.onJobFinished(this);
        }
    }

    private Molecule chemAxonOptimizer()
    {
        //optimize molecule code not shown
        return molecule;

    }


    public Molecule getOptimizedMol()
    {
        return mol3D;
    }
}
0 голосов
/ 13 марта 2012

используйте Callable:

public class Optimizer3D implements Callable<Molecule>{
    private Molecule mol3D;
    private Molecule mol2D;

    Optimizer3D(Molecule mol2D_)
    {
       this.mol2D = mol2D_; 
    }

    @Override
    public Molecule call() {
        mol3D = chemAxonOptimizer();
        return getOptimizedMol();
    }

    private Molecule chemAxonOptimizer()
    {
        //optimize molecule code not shown
        return molecule;

    }


    private Molecule getOptimizedMol()
    {
        return mol3D;
    }
}

затем от вашего исполнителя:

Future<Molecule > future = executor.submit(yourTask);
Molecule  yourValue = future.get();
...