package trainticket;
import java.util.Stack;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;
import org.htmlparser.util.ParserException;public class TrainAction extends DispatchAction implements Runnable{
//火车票查询
public int i;
public int succesnum; //成功数
String result = null;//页面分析后的结果。用字符串表示 public boolean flag = true;
public static Stack<String> s;
public ActionForward searchtrain(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {

s = new Stack<String>();
String result = null;
int succesnum = 0;
result= "";
System.out.println("Start:" + System.nanoTime());
for (int i = 0; i < 100; i++)
{
s.add(" http://search.huochepiao.com/chaxun/resultc.asp?txtCheci=" + "G" + i);
}
for (int i = 0; i < 100; i++)
{
s.add(" http://search.huochepiao.com/chaxun/resultc.asp?txtCheci=" + "Z" + i); }
for (int i = 0; i < 100; i++)
{
s.add(" http://search.huochepiao.com/chaxun/resultc.asp?txtCheci=" + "D" + i);
}
for (int i = 0; i < 10; i++)
{
TrainAction t = new TrainAction();
Thread thread = new Thread(t);
thread.start();
}
request.setAttribute("succesnum", succesnum);
request.setAttribute("result", result);
return mapping.findForward("ok");
}
public void run()
{ while (this.flag) //while(this.flag)
{
if (s.size() == 0)
{
this.flag = false;
System.out.println(System.nanoTime());
return;
}
String url = (String) s.pop(); String htmlContent = Trainsearchhttpcilent.doGet(url); //获取抓取页面信息
int looplock = 10;
while(htmlContent.length()<1 && looplock>0)
{
htmlContent = Trainsearchhttpcilent.doGet(url);;
looplock--;
}
if (htmlContent.indexOf("车次信息暂不存在") != -1)
{
System.out.println(url.substring(url.indexOf("=")+1) + "次列车信息不存在");

else
{
this.succesnum++;
         try {
result =result+TrainHtmlAnalysis.getContent(htmlContent);//获取页面分析后数据
} catch (ParserException e) {
// TODO Auto-generated catch block
result =result+"";
}
System.out.println(url.substring(url.indexOf("=")+1) + "抓取完毕");
}
} }

}

发现里面会先去执行mapping.findForward("ok");再娶执行run方法
我想要的到的两个参数初始值;该怎么去调整啊
从来没用过多线程、、、、

解决方案 »

  1.   

    发现里面会先去执行mapping.findForward("ok");再娶执行run方法
    我想要得到的两个参数一直是初始值;该怎么去调整啊
    从来没用过多线程、、、、
      

  2.   

    多线程不是本来就是这样的么。for (int i = 0; i < 10; i++)
                {
                    TrainAction t = new TrainAction();
                    Thread thread = new Thread(t);
                    thread.start();
                }        
                request.setAttribute("succesnum", succesnum);
                request.setAttribute("result", result);
                return mapping.findForward("ok");你这里另外起个线程去跑、代码不会等到你新起的线程执行完后在跑后面的代码的、
     所有你塞进去的就总是初始值了、
      

  3.   

    http://liuxailf.iteye.com/blog/376329
     看下这个吧、应该能解决你的问题。
      

  4.   

    因该说 for (int i = 0; i < 10; i++)
                {
                    TrainAction t = new TrainAction();
                    Thread thread = new Thread(t);
                    thread.start(); //启动线程后,这个循环还是要继续,循环完了,就启动了10个线程,那么主线程还要继续执行下面的红色部分代码,只不过是和你的run中的代码交替执行
                }        
                request.setAttribute("succesnum", succesnum);
                request.setAttribute("result", result);
                return mapping.findForward("ok");
      

  5.   

    那怎么改可以等执行完public void run()方法后再执行
     request.setAttribute("succesnum", succesnum);
    request.setAttribute("result", result);
    return mapping.findForward("ok");呢
      

  6.   

    我觉得可以把线程的这块东西放到一个service方法中,然后在action中调用这个 service.method()方法,这样在action中会等到service.method()方法返回了才往下执行吧,理论上好像可以呵呵,你试试看吧,坐等高手