2010-02-19 159 views
8

返回對象我有一個擴展Thread一個Java類,它基本上看起來像下面這樣:需要幫助線程的run方法

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() { 
     ... 
    } 
} 

我需要run()方法返回一個ByteArrayOutputStreamString。但是,因爲它在Threadrun()方法中,我不能將方法的返回類型設置爲ByteArrayOutputStreamString

HttpRequestDispatcher類被稱爲一個名爲OAuth.java類裏面。

我該如何解決這種情況?

回答

8

有幾種解決方案,這一問題:

  • 使用的數據結構,外部線程。當線程即將完成時,傳遞構造函數中的對象並更新它。

  • 使用回調方法。線程完成後,調用回調函數。

  • 利用一個java.util.concurrent.Future(爪哇> = 1.5):

    Future表示異步計算的結果。提供的方法用於檢查計算是否完成,是否等待完成以及檢索計算結果。

+0

使用回調方法:當HttpRequest成功或失敗時,線程將完成。假設我有兩個方法:requestSucceeded和requestFailed。線程將根據其結果調用其中一種方法。我的一個問題是如何將requestSucceeded或requestFailed的結果返回到最初啓動Thread的OAuth.java中的原始方法?謝謝! – littleK 2010-02-20 00:30:01

+0

您可以在OAuth.java中定義您的回調。將OAuth對象傳遞給線程。然後,根據結果調用適當的回調。如果您需要將多個線程分派給不同的操作,則回調函數可以接受'發件人'作爲參數之一。這只是一個想法.. – miku 2010-02-20 00:39:18

7

讓它實現Callable<T>而不是ThreadRunnable。這裏T必須代表結果的類型。使用ExecutorService來執行它。它會返回Future<V>的風味結果。

這是SSCCEStringT,只是copy'n'paste'n'run它。

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

我打算嘗試這種方法。如果你看看我對下面的帖子的評論,你會發現Thread有兩種情況:它會成功並返回一個ByteArrayOutputStream,否則它將失敗並返回一個流。這是接受不同類型對象的好方法嗎?我在尋找多功能性 - 使用這個HttpRequestDispatcher將會有很多不同的類 – littleK 2010-02-20 02:40:15

+0

將它抽象化並命名爲'HttpResponse'。它會變得更直接。 – BalusC 2010-02-20 03:11:14