我必须通过某个端口向一些计算机发送一组文件。事实是,每次调用发送文件的方法时,都会计算目标数据(地址和端口)。因此,使用为每个方法调用创建一个线程的循环,并用BindException的try-catch语句包围方法调用,以处理尝试使用已使用端口的程序的情况(不同的目标地址可能通过相同的端口接收消息)告诉线程等待几秒钟,然后重新启动重试,并继续尝试,直到不会抛出异常(运输成功执行)。 我不知道为什么(虽然我第一次看到它的时候可以猜到),Netbeans警告我说,在循环中睡眠一个Thread对象并不是最好的选择。然后我搜索了一下以获取更多信息,并找到this link to another stackoverflow post, which looked so interesting(我从来没有听说过the ThreadPoolExecutor class)。我一直在阅读这个链接和API以改进我的程序,但我还不确定我应该如何将它应用到我的程序中。请有人帮忙吗?告诉ThreadPoolExecutor何时应该继续运行
编辑:重要的代码:
for (Iterator<String> it = ConnectionsPanel.list.getSelectedValuesList().iterator(); it.hasNext();) {
final String x = it.next();
new Thread() {
@Override
public void run() {
ConnectionsPanel.singleAddVideos(x);
}
}.start();
}
private static void singleAddVideos(String connName) {
String newVideosInfo = "";
for (Iterator<Video> it = ConnectionsPanel.videosToSend.iterator(); it.hasNext();) {
newVideosInfo = newVideosInfo.concat(it.next().toString());
}
try {
MassiveDesktopClient.sendMessage("hi", connName);
if (MassiveDesktopClient.receiveMessage(connName).matches("hello")) {
MassiveDesktopClient.sendMessage(newVideosInfo, connName);
}
} catch (BindException ex) {
MassiveDesktopClient.println("Attempted to use a port which is already being used. Waiting and retrying...", new Exception().getStackTrace()[0].getLineNumber());
try {
Thread.sleep(MassiveDesktopClient.PORT_BUSY_DELAY_SECONDS * 1000);
} catch (InterruptedException ex1) {
JOptionPane.showMessageDialog(null, ex1.toString(), "Error", JOptionPane.ERROR_MESSAGE);
}
ConnectionsPanel.singleAddVideos(connName);
return;
}
for (Iterator<Video> it = ConnectionsPanel.videosToSend.iterator(); it.hasNext();) {
try {
MassiveDesktopClient.sendFile(it.next().getAttribute("name"), connName);
} catch (BindException ex) {
MassiveDesktopClient.println("Attempted to use a port which is already being used. Waiting and retrying...", new Exception().getStackTrace()[0].getLineNumber());
try {
Thread.sleep(MassiveDesktopClient.PORT_BUSY_DELAY_SECONDS * 1000);
} catch (InterruptedException ex1) {
JOptionPane.showMessageDialog(null, ex1.toString(), "Error", JOptionPane.ERROR_MESSAGE);
}
ConnectionsPanel.singleAddVideos(connName);
return;
}
}
}
而不是谈论它,你应该后t他自己编码。 – 2012-08-16 18:45:42
如果您将用户名改为真实的话,我会为您+1,那么您将拥有21的代表,这应该足以访问stackoverflow聊天(位于评论链接旁边的顶部)。因为你提出的问题不是问题。 – 2012-08-16 19:30:28
我以为名字改变的可能性要求最低的声望,对不起老兄。 @MarkoTopolnik,代码补充说。感谢您的关注(我通过解释会比代码更受欢迎)。 – 2012-08-16 20:11:47