繁体   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