如何从java servlet控制类(运行/暂停)

时间:2012-03-02 13:17:33

标签: java multithreading servlets

我有一个充当简单爬虫的类,我想在servlet中调用这个类。

我的想法是从用户获取一个url然后url请求将被传递给servlet并且servelt将url传递给类,并且类将开始爬行。我希望我的servlet只创建这个类的一个实例。来自crawlwer的检索数据将由类直接添加到DB中。 我想控制类的行为,如从servlet运行/暂停/停止 (对于这个问题,我认为我能够创建一个简单的xml文件,它将在servlet和类之间共享,如果servlet更改状态代码类应该响应状态更改)

但我对如何控制类的行为有一些疑问,例如命令它运行/停止/停止,因为我的类没有多线程,我不知道调用它后会调用类会发生什么来自servlet,因为这个类需要从网络中读取,显然我在运行它时会有一些差距/冻结阶段。

如何解决这种情况下的并发问题?换句话说,我是否会遇到并发问题?

问候。

2 个答案:

答案 0 :(得分:2)

这取决于您使用的Servlet容器。一些容器每个用户请求产生一个新的Thread(几乎总是这是所需的行为),所以你绝对应该设计并发。

你可以让Servlet类实现SingleThreadModel,然后在service方法中你可以直接调用crawler类代码,因为一次只有一个线程会进入service

这意味着只能在给定时间处理一个URL,这可能不是你想要的,所以不要这样做,不要在init方法中实现SingleThreadModel并创建一个singleton executor服务:

ExecutorService ex = Executors.newFixedThreadPool(20); //Only 20 tasks at a given time

然后,在service方法中,使用请求中指定的URL创建一个新的CrawlingTask(Runnable),然后将任务提交给执行程序。

这样你也可以关闭它:

ex.shutdown();

由于ExecutorService是线程安全的,因此在排队任务时不必担心并发性。

答案 1 :(得分:-1)

首先,了解线程之间的区别。类只是代码,线程是代码执行的位置。你没有停止/停止一个类,你停止或停止正在执行类中的代码的线程。

我建议你开始阅读Java concurrency programming.,因为你所描述的是多线程和线程同步。