关于启用 多 线程 检索。

08-08-09 thankyou2008
我在一个 while循环的 多线程查询 程序 中

出现了 个问题,

ServiceThread st = new ServiceThread(url, "a web service thread");

st.start();

这个线程 没 把 自己run方法 完全 执行完,就 去 执行 这个while 循环 后面的内容去了。

关键代码如下:在一个while循环中每循环一次 取得 一个url地址,然后 根据 这个url地址进行 查询,我每一次查询 都启用一个线程。

while (it.hasNext()){

linkedListCell=null;

foo = (Element) it.next();

String url= foo.elementText("url") ;

url= url+"SearchForYou rvices archCell";

ServiceThread st = new ServiceThread(url, "a web service thread");

st.start();

}

1.是不是可以 这个后面 来一句 判断 ,前面的线程 是否 结束了 ,然后 再 执行 下面的 啊?怎么 判断呢?

//获取结束时间

long end=System.currentTimeMillis();

//打印一下

system.out.println(end);

double intervalTime=(end-start)*0.001;

//本类 执行完之后转向 page所指向的 action类

String target = "Page";

return mapping.findForward(target);

另外我的 ServiceThread部分代码如下:

public class ServiceThread extends Thread{

private String ip; //每一个线程对象启动时要访问的ip

private String searchContent;

public ServiceThread(String ip, String str,String searchContent){

super(str);

this.ip = ip;

this.searchContent=searchContent;//传过来 的查询内容,即查询关键字。

}

public void run(){

//根据ip创建相应的web Service并通过它进行远程方法调用

String url= ip+"SearchForYou/services/SearchCell";

//构建 URL

URL aUrl = null;

try {

aUrl = new URL(url);

} catch (MalformedURLException e2) {

// TODO Auto-generated catch block

e2.printStackTrace();

}

System.out.println("已经生成了URL");

//下面的代码 新建 web service 服务,并通过 它 进行 远程方法 调用。

Service service = new Service();

Call call = null;

System.out.println("创建了service");

try {

call = (Call) service.createCall();

} catch (ServiceException e1) {

// TODO Auto-generated catch block

e1.printStackTrace();

}

System.out.println("(Call) service.createCall()");

call.setTargetEndpointAddress( aUrl );

call.setOperationName("execute");

call.setEncodingStyle("UTF-8");

String linkedListStr =null;

Integer timeout= new Integer("0");

try{

linkedListStr = (String) call.invoke(new Object [] { searchContent });

call.setTimeout(timeout);

}catch(Exception e){

System.out.println(url+"连接超时,这台机子程序没有配置完全,或者网络连接有问题");

linkedListStr=null;

}

LinkedList linkedListCell=null;

if(linkedListStr!=null )linkedListCell=(LinkedList)decodeBean(linkedListStr); // 如果对方机器 传递过来的结果集--xml串不为空,则 对其进行decode处理。

System.out.println("linkedListCell=(LinkedList)decodeBean(linkedListStr)");

System.out.println(linkedListCell.size());

//把从 每一个服务器内 获取的 记录集加到内存 中的静态链表 中

if(linkedListCell!=null )GlobalUtil.resultLinkedList.addAll(linkedListCell);

System.out.println("总链表中个数"+GlobalUtil.resultLinkedList.size());

}

    

banq
2008-08-11 10:16
>这个线程 没 把 自己run方法 完全 执行完,就 去 执行 这个while 循环 后面的内容去了。

这就是线程的特点啊,一定要记住:线程运行方式不是由你控制的,而是由CPU控制的,所以,你不可能随心所欲地控制某个线程暂停,然后让它及时启动。

建议使用Queue等机制来实现你的目的。

猜你喜欢