簡體   English   中英

如何將變量傳遞給內部線程類?

[英]How can I pass a variable to an inner thread class?

我想定期將圖像加載到圖像項目。 我的外部類正在生成URL,我需要將它傳遞給內部類。 我該如何實現這一目標?

public class MapTimer extends TimerTask{
    public void run() {
        System.out.println("Map starting...");

        String URL=null,serverquery=null;
        try {
            sendMessage(this.message);
            item.setLabel(item.getLabel()+"start");
            serverquery=receiveMessage();
            item.setLabel(item.getLabel()+"stop");
            URL = getURL(serverquery);               // my url to be passed to innerclass
            System.out.println("URl is "+serverquery);
            item.setLabel(URL+item.getLabel());
            Thread t = new Thread() {
            public void run() {
                    item.setLabel(item.getLabel()+"6");
                    try {
                          Image image = loadImage(URL);            // using url
                          System.out.println("GEtting image....");
                          item = new ImageItem(null, image, 0, null);
                          form.append(item);
                          display.setCurrent(form);

                    } catch (IOException ioe) {
                          item.setLabel("Error1");
                    }
                    catch (Exception ioe) {
                          item.setLabel("Error1");
                    }
              }
         };
         t.start(); // write post-action user code here
     }
     catch(Exception e){
         System.out.println("Error3"+e);
     }
  }    
}

如何將URL傳遞給我的innerthread類?

您必須聲明變量final或不使用變量,而是使用類中的字段。

public class YourClass {

private String url;

public void yourMethod {
   url = getURL(serverquery);
   System.out.println("URl is "+serverquery);
   item.setLabel(URL+item.getLabel());
   Thread t = new Thread() {
      public void run() {
         item.setLabel(item.getLabel()+"6");
         try {
           Image image = loadImage(url);            // using url
           System.out.println("GEtting image....");
           item = new ImageItem(null, image, 0, null);
           form.append(item);
           display.setCurrent(form);

    } catch (IOException ioe) {
      item.setLabel("Error1");
    }
                catch (Exception ioe) {
      item.setLabel("Error1");
    }

  }
};
t.start(); // write post-action user code here
}

}

如果您的URL包含在最終引用中,它應該可以工作。 這意味着引用不會移動。 因此,您無法將其初始化為null然后調用getURL,您需要在此時聲明它:

final String URL = getURL(serverquery);

我發現,當您的線程獲取信息或收到信息時,(至少)有兩種主要方法可以執行此操作(在您的案例中為URL)

1)獲取信息:

你想要做的是在你的線程中保留包含你需要的數據的對象的引用(比如URL),當你准備好線程時,獲取要加載的下一個項目/ URL。

public class MapTimer extends TimerTask{
   public void run() {
     ...
   }
   private URLGenerator urlGenerator = null;
   public MapTimer(URLGenerator urlGen){
      ...
   }

這將為您提供在線程空閑時獲取下一個URL的選項(當然使用if(urlGen!= null))

2)接收信息

對於僅在程序的其余部分想要(用戶輸入數據等)時調用線程的情況更好地工作

public class MapTimer extends TimerTask{
       public void run() {
         ...
       }
       private URL urlToLoad = null;
       public void setURL(URL urlToLoad){
          ...
          //store and wake up thread
       }

這樣你的線程就會通過setter接收它需要運行的數據,處理它然后等待下一個數據發送給它(當然你需要注意線程問題,如多次調用等)

希望這對你有所幫助

賈森

只需將該字段設為屬於該類的靜態變量,而不是該類的任何對象實例,如下所示:

public YourClass {

    private static String url;

    //...
}

但請注意,靜態變量將在類的所有對象實例之間共享。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM