2012-03-02 61 views
0

我有一个充当简单爬虫的类,我想在一个servlet中调用这个类。如何从java servlet控制一个类(运行/暂停)

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

但我有一些疑虑,如何控制类的行为,如命令它运行/暂停/停止,因为我的课程不是多线程我不知道什么是什么会在从servlet调用它之后调用类,因为这个类需要从网络中读取,显然在运行它时会有一些间隙/冻结阶段。

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

关于。

回答

2

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

您可以使Servlet类实现SingleThreadModel,然后在service方法中您可以直接调用爬虫类代码,因为一次只有一个线程会输入service

这意味着只有一个URL可以在给定时间进行处理,这可能不是你想要的,所以不是说,不实现SingleThreadModel,并对创建init方法一个单执行服务:

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

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

这样,你也可以关闭它:

ex.shutdown(); 

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

-1

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

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