Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从Javaservlet控制类(运行/停止)_Java_Multithreading_Servlets - Fatal编程技术网

如何从Javaservlet控制类(运行/停止)

如何从Javaservlet控制类(运行/停止),java,multithreading,servlets,Java,Multithreading,Servlets,我有一个充当简单爬虫的类,我想在servlet中调用这个类 我的想法是从用户那里获取一个url,然后url请求将传递给servlet,servelt将url传递给类,类将开始爬网。我希望我的servlet只创建这个类的一个实例。从crawower检索到的数据将由该类直接添加到数据库中。 我想控制类的行为,比如从servlet运行/停止/停止 (对于这个问题,我认为我能够创建一个简单的xml文件,该文件将在servlet和类之间共享,如果servlet更改,状态代码类将响应状态更改) 但是我对如何

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

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

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

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


问候。

首先,了解类和线程之间的区别。类就是代码,线程就是执行代码的地方。您不会停止/停止类,而是停止或停止正在类中执行代码的线程


我建议您开始阅读,因为您所描述的内容主要是关于多线程和线程同步。

这取决于您使用的Servlet容器。有些容器会为每个用户请求生成一个新线程(几乎总是这样),因此您应该明确地设计并发性

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

这意味着在给定时间只能处理URL,这可能不是您想要的,因此,不要实现SingleThreadModel并在init方法中创建singleton executor服务:

ExecutorService ex = Executors.newFixedThreadPool(20); //Only 20 tasks at a given time
然后,在
服务
方法中,使用请求中指定的URL创建一个新的爬网任务(Runnable),然后将任务提交给执行者

这样,您也可以关闭它:

ex.shutdown();
由于ExecutorService是线程安全的,所以在将任务排队时不必担心并发性