如何添加到发送队列,例如我使用 JFileChooser 选择一个文件,然后在新线程中将其发送到客户端,我想选择另一个文件并将其发送。发生的情况是它同时发送文件并且客户端的输出被破坏。
我希望能够添加到某种“队列”中,以便在发送第一个文件时,服务器将开始发送下一个文件。
最佳答案
服务器->客户端之间套接字通信
的一个好方法是每个客户端有1个线程,并让该线程从java.util.concurrent.BlockingQueue
读取。这样的接口(interface)非常适合管理多线程并发性(就像所有java.util.concurrent对象一样)。
这个想法是,服务器有一个像这样的ClientThread
:
class BroadCastThread extends Thread{
LinkedBlockingQueue<SendFileTask> bcQueue = new LinkedBlockingQueue<>();
@Override
public void run() {
while( true ){
try {
SendFileTask task = bcQueue.take();
task.sendFile();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
void addTask(SendFileTask rt) throws InterruptedException{
bcQueue.put(rt);
}
}
interface SendFileTask{
void sendFile() throws Exception;
}
并通过向线程对象添加任务
来使用它:
BroadCastThread bct = new BroadCastThread();
bct.start();
//With lambda
bct.addTask(() -> {
//Send file code
});
//Without lambda
bct.addTask(new SendFileTask() {
@Override
void sendFile() throws Exception {
//Send file code
}
});
如果您希望 sendFile
方法将其作为参数接收,您甚至可以将 Socket 信息存储在线程中,并将其传递给任务接口(interface)。
关于java - 在java回调中发送多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27827264/