我正在为备份服务器编写一个客户端。我的客户为备份安排了一些文件夹。(例:每周五X小时)。我用于调度cron4j ( Linux到java的一个端口)。
一切都很好,直到我同时安排多个上传作业,然后由于多个线程,它变得混乱。
有人能帮我解决多线程上传到ftp服务器的问题吗?(每个线程都有在Ftp服务器上上载目录的任务)。
发布于 2008-12-17 20:59:48
当你说它变得有点“混乱”时,你能解释一下你的意思吗?有什么特殊症状吗?
不管怎么说,从一个干净的工作表来看,我想说,您希望控制您一次执行的并发上传的数量,否则您可能会遇到某种限制,即FTP服务器将允许单个客户端的连接数量,或者客户端操作系统允许的连接数。您的应用程序可能更多地被带宽绑定,而不是由CPU绑定,因此运行过多的线程可能会适得其反。本质上,您将在一次上传更多的项目,但吞吐量较低。
我假设您的应用程序有一组任务,这些任务是cron4j关闭的,这些任务然后通过FTP获取一个目录并上传它,这听起来对吗?
如果是这样的话,我建议将其分成几个阶段,首先cron4j启动任务,该任务构造一个可运行的对象,在执行该对象时将执行FTP上载,而不是执行上载本身的任务。将这个可运行的程序放在一个队列中( java.util.concurrent中的阻塞队列是个好主意)。然后,在线程池中运行另一个任务的一些实例,这些任务将从队列中取出作业并执行它们(尝试池中的线程数,以查看哪些任务提供了良好的吞吐量)。这将为您提供一组相互竞争的用户,您可以将其限制为并发上传的有效数量(例如一次4个)。
正如注释中所指出的,SEDA模式听起来相当有趣。如果您打算使用Java进行任何并发编程,我建议您获得Doug的“Java并发编程:设计原则和模式”的副本,它不包括Java 5内容,但大多数内容都是基于本书中的内容。他清楚地解释了许多关于线程安全和如何编写好Java代码的问题。
发布于 2010-09-10 15:54:55
ipworks FTP类是线程安全的。必须在实践中阅读Brian的Java并发.
public class ServerConnection extends Thread {
// the connection to the ftp server
private final Ftp connection;或者,如果不喜欢自己管理线程,则可以实现Runnable并使用executorService .
https://stackoverflow.com/questions/375129
复制相似问题