Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
多线程处理我的客户机Java程序_Java_Multithreading_Client Server - Fatal编程技术网

多线程处理我的客户机Java程序

多线程处理我的客户机Java程序,java,multithreading,client-server,Java,Multithreading,Client Server,我有一个Java客户端(客户机-服务器应用程序),它完成两项主要任务:(1)侦听服务器以接收文件并将其保存到本地文件夹;(2)监视该文件夹的更改并将更改发送到服务器。我想在各自的线程中运行每个线程。首先,在单独的线程上运行每个任务是否是一个好主意。第二,当任何一个任务使用该文件夹时,如何锁定该文件夹以避免干扰 在单独的线程上运行每个任务是一个好主意吗 将程序拆分为线程听起来是个好主意,因为这两个任务可以异步并发地工作。第一个线程可以在第二个线程上载的同时下载 当任一任务使用文件夹时,如何锁定该文

我有一个Java客户端(客户机-服务器应用程序),它完成两项主要任务:(1)侦听服务器以接收文件并将其保存到本地文件夹;(2)监视该文件夹的更改并将更改发送到服务器。我想在各自的线程中运行每个线程。首先,在单独的线程上运行每个任务是否是一个好主意。第二,当任何一个任务使用该文件夹时,如何锁定该文件夹以避免干扰

在单独的线程上运行每个任务是一个好主意吗

将程序拆分为线程听起来是个好主意,因为这两个任务可以异步并发地工作。第一个线程可以在第二个线程上载的同时下载

当任一任务使用文件夹时,如何锁定该文件夹以避免干扰

我根本不会锁。我会让您的第一个线程从服务器读取一个文件,将其写入文件夹,然后将一个
FileToSend
对象(或者可能只是一个
文件
对象)添加到文件夹。因此,您的第二个线程不会查看目录,而是在
BlockingQueue
上等待文件发送到服务器。这门课应该做得很好。
BlockingQueue
负责为您锁定

如果确实需要共享锁,则可以将锁对象注入两个线程:

private final Object folderLock = new Object();
...
new Thread(new Downloader(folderLock)).start();
new Thread(new Uploader(folderLock)).start();
...
一个好的模式是在
Uploader
类上定义一个
addFileToUpload(filefiletoupload)
方法。然后你的
上传者可以决定如何处理它。
BlockingQueue
可以是
上传程序的本地

Uploader uploader = new Uploader();
// pass the uploader into the downloader
new Thread(new Downloader(uploader)).start();
new Thread(uploader).start();
在单独的线程上运行每个任务是一个好主意吗

将程序拆分为线程听起来是个好主意,因为这两个任务可以异步并发地工作。第一个线程可以在第二个线程上载的同时下载

当任一任务使用文件夹时,如何锁定该文件夹以避免干扰

我根本不会锁。我会让您的第一个线程从服务器读取一个文件,将其写入文件夹,然后将一个
FileToSend
对象(或者可能只是一个
文件
对象)添加到文件夹。因此,您的第二个线程不会查看目录,而是在
BlockingQueue
上等待文件发送到服务器。这门课应该做得很好。
BlockingQueue
负责为您锁定

如果确实需要共享锁,则可以将锁对象注入两个线程:

private final Object folderLock = new Object();
...
new Thread(new Downloader(folderLock)).start();
new Thread(new Uploader(folderLock)).start();
...
一个好的模式是在
Uploader
类上定义一个
addFileToUpload(filefiletoupload)
方法。然后你的
上传者可以决定如何处理它。
BlockingQueue
可以是
上传程序的本地

Uploader uploader = new Uploader();
// pass the uploader into the downloader
new Thread(new Downloader(uploader)).start();
new Thread(uploader).start();


你能编辑你的帖子来展示你的一些作品吗?你试过什么?你读过什么文档?@Gray我不是在要求代码更正;我在寻求建议。如何锁定资源(在我的例子中是文件夹)并将其解锁。观察一下,如果你想为单线程锁定文件夹,那么拥有两个线程有什么意义?@Vash一个线程可以在另一个线程发送文件时更改文件,或者任何你能想到的干扰。写入收到的文件是必须发送到服务器的更改吗?要从中加载文件的服务器和要将更改发送到的服务器-它们是相同的服务器还是不同的服务器?您可以编辑您的帖子以显示您的一些工作吗?你试过什么?你读过什么文档?@Gray我不是在要求代码更正;我在寻求建议。如何锁定资源(在我的例子中是文件夹)并将其解锁。观察一下,如果你想为单线程锁定文件夹,那么拥有两个线程有什么意义?@Vash一个线程可以在另一个线程发送文件时更改文件,或者任何你能想到的干扰。写入收到的文件是必须发送到服务器的更改吗?加载文件的服务器和发送更改的服务器是相同的还是不同的服务器?太棒了!BlockingQueue是Java类吗?如何在两个线程之间共享它?是的
BlockingQueue
是一个Java接口
LinkedBlockingQueue
是其中一种实现。您可以在外部定义它并将其传递到每个线程
Runnable
。参见上面的锁示例。好的,下载程序向上传程序发送一个
addFileToUpload
msg,但是上传程序是下载程序中的一个成员,对吗?下载程序将文件上传到它。或者我应该让那个方法成为类方法吗?是的,我会让它成为@saadtaame的成员。课堂教学法会起作用,但在我看来很糟糕。太好了!BlockingQueue是Java类吗?如何在两个线程之间共享它?是的
BlockingQueue
是一个Java接口
LinkedBlockingQueue
是其中一种实现。您可以在外部定义它并将其传递到每个线程
Runnable
。参见上面的锁示例。好的,下载程序向上传程序发送一个
addFileToUpload
msg,但是上传程序是下载程序中的一个成员,对吗?下载程序将文件上传到它。或者我应该让那个方法成为类方法吗?是的,我会让它成为@saadtaame的成员。类方法可以工作,但它在IMHO中不好。