概述
编辑:
我现在确定问题与此有关
????while(true)循环保存所有其他命令,因为我已将其注释掉,并且应用程序在没有附加异常的情况下进行部署.我不确定它有多重要,但我的ServletContextListener实现如下所示:
?????????公共类BidPushService实现ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
//Some init code not relevant, omitted for clarity
BidPushThread t= new BidPushThread();
t.setServletContext(sce.getServletContext());
t.run();
}
所以现在线程在部署应用程序时运行但由于while循环被注释它没有任何实际意义.
当我的应用程序加载时,我需要在后台运行一个线程,并且不断(没有超时)检查某个队列中的对象.当然,一旦有了对象,它就“照顾它们”,然后继续检查队列.
目前,我正在实现ServletContextListener接口,并在应用程序加载时调用.在其中,我做了一些维护工作并启动了一个我从java.lang.Thread继承的线程.
这是我的问题开始的地方(或者我认为).在我的run()方法中,我有一个
while (true) {
//some code which doesn't put the thread to sleep ever
}
当我尝试将我的应用程序部署到服务器时,我得到一个java.util.concurrent.TimeOutException.
我究竟做错了什么?
我不能有一个始终运行的线程吗?删除应用程序后,该线程将由ServletContextListener中的相应事件停止.
我确实需要能够毫不拖延地检查队列的东西.
非常感谢您的帮助!
编辑:这是堆栈跟踪
GlassFish: deploy is failing=
java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(Unknown Source)
at java.util.concurrent.FutureTask.get(Unknown Source)
at com.sun.enterprise.jst.server.sunappsrv.SunAppServerBehaviour.publishDeployedDirectory(SunAppServerBehaviour.java:710)
at com.sun.enterprise.jst.server.sunappsrv.SunAppServerBehaviour.publishModuleForGlassFishV3(SunAppServerBehaviour.java:569)
at com.sun.enterprise.jst.server.sunappsrv.SunAppServerBehaviour.publishModule(SunAppServerBehaviour.java:266)
at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publishModule(ServerBehaviourDelegate.java:948)
at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publishModules(ServerBehaviourDelegate.java:1038)
at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:872)
at org.eclipse.wst.server.core.model.ServerBehaviourDelegate.publish(ServerBehaviourDelegate.java:708)
at org.eclipse.wst.server.core.internal.Server.publishImpl(Server.java:2690)
at org.eclipse.wst.server.core.internal.Server$PublishJob.run(Server.java:272)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:55)
我的代码:
public class BidPushThread extends Thread {
private ServletContext sc=null;
@Override
public void run() {
if (sc!=null){
final Map> aucWatchers = (Map>) sc.getAttribute("aucWatchers");
BlockingQueue aucBids = (BlockingQueue) sc.getAttribute("aucBids");
Executor bidExecutor = Executors.newCachedThreadPool();
final Executor watcherExecutor = Executors.newCachedThreadPool();
while(true)
{
try // There are unpublished new bid events.
{
final Bid bid = aucBids.take();
bidExecutor.execute(new Runnable(){
public void run() {
List watchers = aucWatchers.get(bid.getAuctionId());
for(final AsyncContext aCtx : watchers)
{
watcherExecutor.execute(new Runnable(){
public void run() {
// publish a new bid event to a watcher
try {
aCtx.getResponse().getWriter().print("A new bid on the item was placed. The current price "+bid.getBid()+" , next bid price is "+(bid.getBid()+1));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
});
}
}
});
} catch(InterruptedException e){}
}
}
}
public void setServletContext(ServletContext sc){
this.sc=sc;
}
}
对不起格式化的混乱,但对于我的“缩进代码4个空格”的生命,对我来说不起作用
编辑:阅读’BlockingQueue’并实现它,但我仍然得到完全相同的异常和堆栈跟踪.更改了上面的代码以反映’BlockingQueue’的使用
最后
以上就是昏睡夏天为你收集整理的java 让线程一直运行_java – 如何创建一个在我的应用程序运行时一直运行的线程...的全部内容,希望文章能够帮你解决java 让线程一直运行_java – 如何创建一个在我的应用程序运行时一直运行的线程...所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复