2010-02-19 12 views
8

tengo una clase Java que se extiende Thread, que básicamente tiene el siguiente aspecto:necesita ayuda objeto de regresar en el método run hilo

public class HttpRequestDispatcher extends Thread { 
    private String url; 
    private String method; // GET or POST 
    private byte[] postData; 

    public HttpRequestDispatcher(String url, String method, byte[] postData) { 
     this.url = url; 
     this.method = method; 
     this.postData = postData; 
    } 

    public HttpRequestDispatcher(String url, String method) { 
     this.url = url; 
     this.method = method; 
    } 

    public void run() { 
     ... 
    } 
} 

necesito el método run() para devolver un ByteArrayOutputStream o una String. Sin embargo, como está en el método run() del Thread, no puedo establecer el tipo de devolución del método en ByteArrayOutputStream o String.

La clase HttpRequestDispatcher se llama dentro de una clase llamada OAuth.java.

¿Cómo puedo evitar esta situación?

Respuesta

8

Hay varias soluciones a este problema:

  • Utilice una estructura de datos externo al hilo. Pase el objeto en su constructor y actualícelo cuando su tema esté por terminar.

  • Utilice un método de devolución de llamada. Cuando termine el hilo, llame a la devolución de llamada.

  • hacer uso de un java.util.concurrent.Future (Java> = 1,5):

    Un futuro representa el resultado de un cálculo asíncrono. Se proporcionan métodos para verificar si el cálculo está completo, para esperar su finalización y para recuperar el resultado del cálculo.

+0

Con la devolución de llamada enfoque método: El hilo terminará cuando el HttpRequest tiene éxito o no. Entonces digamos que tengo dos métodos: requestSucceeded y requestFailed. El hilo llamará a cualquiera de esos métodos, dependiendo de su resultado. Mi única pregunta es cómo puedo devolver los resultados de requestSucceeded o requestFailed al método original en OAuth.java que originalmente inició el subproceso? ¡Gracias! – littleK

+0

Podría, por ejemplo, definir sus devoluciones de llamada en OAuth.java. Pase el objeto OAuth hacia el hilo. Luego, dependiendo del resultado, llame a la devolución de llamada apropiada. La función de devolución de llamada podría aceptar 'el emisor' como uno de los parámetros, si necesita despachar hilos múltiples a diferentes acciones. Es solo una idea. – miku

7

Let it implementar Callable<T> en lugar de Thread o Runnable. Aquí T debe representar el tipo de resultado. Use ExecutorService para ejecutarlo. Devolverá el resultado con el sabor de Future<V>.

Aquí hay un SSCCE con String como T, solo copie y pase.

package com.stackoverflow.q2300433; 

import java.util.Arrays; 
import java.util.List; 
import java.util.concurrent.Callable; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 

public class Test { 
    public static void main(String... args) throws Exception { 
     ExecutorService executor = Executors.newSingleThreadExecutor(); 
     Future<String> future = executor.submit(new Task()); 
     System.out.println(future.get()); // Prints "result" after 2 secs. 

     // Or if you have multiple tasks. 
     // List<Future<String>> futures = executor.invokeAll(Arrays.asList(new Task())); 
     // for (Future<String> future : futures) { 
     //  System.out.println(future.get()); 
     // } 

     executor.shutdown(); // Important! 
    } 
} 

class Task implements Callable<String> { 
    public String call() throws Exception { 
     Thread.sleep(2000); 
     return "result"; 
    } 
} 
+0

Planeo probar este enfoque. Si miran mi comentario en la publicación siguiente, verán que hay dos casos en los que el Tema terminará ... tendrá éxito y devolverá un ByteArrayOutputStream, o fallará y devolverá una transmisión. ¿Es este un buen método para aceptar diferentes tipos de objetos? Estoy buscando versatilidad. Habrá muchas clases diferentes usando este HttpRequestDispatcher – littleK

+0

Hazlo abstracto y nómbralo 'HttpResponse'. Será más sencillo. – BalusC

Cuestiones relacionadas