我是靠谱客的博主 昏睡夏天,最近开发中收集的这篇文章主要介绍java 让线程一直运行_java – 如何创建一个在我的应用程序运行时一直运行的线程...,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

编辑:

我现在确定问题与此有关

????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 – 如何创建一个在我的应用程序运行时一直运行的线程...所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部