0

在我的代码中,我需要使“getResult”多线程。

X 级

public x() {
    }

public String[] getResult(params) {
//various actions to generate result
}

A级

    X = new X();
    String[] getResult = X.getResult(params);

所以我让 X 类可运行并有一个运行方法。

但是我是否将对 getResult 的调用移到 run 方法中?...然后让 A 类创建一个新的 X 实例,传入参数。

当我这样做时,我不能让 run 方法返回任何东西。所以这显然是错误的。

有人能帮我吗。我只需要使课程可调用吗?还是我做的事情完全错了?

4

4 回答 4

3

您将需要单独的(可能是内部的)类,这些类implement Runnable用于所需的每个单独的功能。

这些类的实例将需要在您的getResult方法中创建和启动。

您需要使用Thread.join等待getResult,直到每个线程完成并整理结果。

于 2013-04-28T11:57:39.403 回答
0

当我这样做时,我不能让 run 方法返回任何东西。所以这显然是错误的。

这并不完全正确。您甚至可以从 run() 方法返回值。您可以通过更新类级别属性来返回一个值。

 public void run(){
   //update class attribute here.. using setter method  
 }
于 2013-04-28T12:02:57.883 回答
0

您需要使用 ThreadLocal,它将适合您的要求。ThredLocal 将 X 作为参数,然后所有线程都可以将它们的线程本地化。

于 2013-04-28T11:56:17.843 回答
0

可以有多种方法来获取从Thread/ Runnablerun 方法返回的值,将返回值存储在全局变量中,使用Callable等。下面的方法使用Callable.

void asyncRun(final String[] params)
        {
            ExecutorService es = Executors.newSingleThreadExecutor(); //or initialize it before
            Future<String[]> f = es.submit(new Callable<String[]>() {
                public String[] call() throws Exception {
                 X = new X();
                 String[] getResult = X.getResult(params);
                 return getResult;              
                }
            });
            // below get call is blocking, you might return Future (f) itself and use it separately
            try {
                String[] val = f.get(); // or have a time out
            } catch (Exception e) {
                // handle exceptions
            }
        }

你的问题似乎你想getParams在一个线程中执行,但在它完成时需要它的结果,这听起来更像是同步方法。

于 2013-04-28T12:11:46.087 回答