我正在使用当前使用标准tcp套接字的库。我的库的最终用户将自己注册为监听器,并且需要在相关消息进入时通知。
如果我在我的库中生成一个工作线程,就会出现一个线程死亡问题,当我的库可能会阻止应用程序在所有用户线程死亡时正常终止。
有没有办法可以在不生成新线程或要求用户轮询库的情况下通知新传入的tcp数据包?
谢谢!
答案 0 :(得分:2)
将工作线程注册为“守护程序”,告诉JVM它不必等待你的线程退出。
http://download.oracle.com/javase/6/docs/api/java/lang/Thread.html#setDaemon(boolean)
答案 1 :(得分:1)
我不知道套接字部分,但是当你产生线程时,你将它标记为一个守护程序线程(setDaemon(true)),那么它不会阻止应用程序退出。
答案 2 :(得分:0)
您可以使用从套接字读取数据的线程。如果工作是受CPU限制的,那么你只需要发送另一个线程就可以获得很少的收益。
另一方面,如果你正在构建一个库,你将无法控制用户在调用监听器方法时会做什么,所以我建议你使用一个内部执行器并给你的库一个像terminate()这样的方法。调用侦听器的方法将被委托给runnable,您可以将其提交给Executor(可以是newSingleThreadExecutor,newCachedThreadPool或者您认为更合适的任何东西)。
这样,用户知道他们必须调用init()和terminate() - 其中init()将初始化Executor,terminate()将负责关闭它。这允许您在库中拥有自己的线程,并防止它们停止主应用程序关闭
看看this,可能会让你更好地了解我在谈论的内容。