读书人

请教一上此线程池为什么会死循环

发布时间: 2013-01-11 11:57:35 作者: rapoo

请问一下此线程池为什么会死循环
需要完成的功能都可正常完成,
但是会出现死循环.
本线程池是通过状态的判断,来对XML进行生成的.
不知为何,劳烦各位.



/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package xml.main;

import xml.bean.RequestBean;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import xml.common.ParentxmlHandler;
import xml.dao.XmlDao;

/**
*
* @author Administrator
*/
public class xmlMultiThreadServer {
private ExecutorService executorService;// 线程池
private static List<Future> pageFutureList;
private final int POOL_SIZE_ONECPU = 10;// 单个CPU线程池大小
private int POOL_SIZE = 0;

public xmlMultiThreadServer() {
POOL_SIZE = Runtime.getRuntime().availableProcessors()
* POOL_SIZE_ONECPU;
pageFutureList = new ArrayList<Future>();
executorService = Executors.newCachedThreadPool();// 工厂类创建固定线程数(CPU核心数*每个U线程池大小)的线程池
System.out.println("startup StartWorkServer!");
}

public void service() {
List<RequestBean> list;
while (true) {
while (!hasFreeThread()) {
try {
Thread.sleep(2000);// 没有可用线程处理需等待2秒钟
} catch (InterruptedException e) {
e.printStackTrace();
}
}
int freeThreadNum = POOL_SIZE - pageFutureList.size();
XmlDao Dao = new XmlDao();
list = Dao.findAllIsNoOper(freeThreadNum);
System.out.println(list.size());
while (list.size() <= 0) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
list = Dao.findAllIsNoOper(freeThreadNum);

}
for (RequestBean requestBean : list) {
ParentxmlHandler ParentxmlHandler = null;
Class<?> handler = null;
try {
XmlDao dao = new XmlDao();
String sendtype = dao.findsendtype();
if(sendtype.equals("1")){
handler = Class.forName("xml.handler.ExportSaleDataMainHandler");
}
if(sendtype.equals("2")){
handler = Class.forName("xml.handler.ExportSaleDataMonMainHandler");
}
if(sendtype.equals("3")){
handler = Class.forName("xml.handler.ExportKcDataMainHandler");
}
if(sendtype.equals("4")){
handler = Class.forName("xml.handler.ExportShopInfoHandler");
}
if(sendtype.equals("5")){
handler = Class.forName("xml.handler.ExportShopInfoHandler");
}
if(sendtype.equals("6")){
handler = Class.forName("xml.handler.ExportShopInfoHandler");
}
if(sendtype.equals("7")){
handler = Class.forName("xml.handler.ExportShopInfoHandler");
}
if(sendtype.equals("8")){
handler = Class.forName("xml.handler.ExportShopInfoHandler");
}
System.out.println("handler" + handler);
} catch (Exception e) {
e.printStackTrace();
}


try {
System.out.println("init");
ParentxmlHandler = (ParentxmlHandler) handler.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
if (ParentxmlHandler == null) {
System.out.println("thread is not init!");
continue;
}
ParentxmlHandler.setRequestBean(requestBean);
Future<String> future = executorService.submit(ParentxmlHandler);
pageFutureList.add(future);
}

}
}

public boolean hasFreeThread() {
synchronized (pageFutureList) {
boolean isFree = false;
List<Future> rmList = new ArrayList<Future>();
if (pageFutureList.size() < POOL_SIZE) {
isFree = true;
}
try {
for (Future temp : pageFutureList) {
if (temp != null && "OK".equals(temp.get())) {
rmList.add(temp);
isFree = true;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (rmList != null && rmList.size() > 0) {
pageFutureList.removeAll(rmList);
}
}
return isFree;
}
}

public static void main(String[] args) {
new xmlMultiThreadServer().service();
}
}




线程池
[解决办法]
debug 调试一下 看看 变量值什么的 ,是否有改变
[解决办法]
你自己在service方法里面不是用while(true)吗,里面的代码又没有退出的意思,这个不死循环还能怎样
[解决办法]
应该由你自己来设计出口....
[解决办法]
在你想跳出的地方 加break;
[解决办法]
while(true) 可以保留 ,在里面加一个if条件 if(){ break;//跳出当前循环} 不就得了 或者你在前面的定义一个
boolean flag = true;
while(flag){
...
//完成某个操作
flag= false;
}
[解决办法]
while循环中,完成操作后,判断条件,break

读书人网 >J2SE开发

热点推荐