Мне нужно отправить набор файлов на несколько компьютеров через определенный порт. Дело в том, что каждый раз, когда вызывается метод, отправляющий файлы, вычисляются данные назначения (адрес и порт). Следовательно, используя цикл, который создает поток для каждого вызова метода и окружает вызов метода оператором try-catch для BindException, чтобы обработать ситуацию, когда программа пытается использовать порт, который уже используется (могут быть разные адреса назначения. получить сообщение через тот же порт), сообщая потоку подождать несколько секунд, а затем перезапустить, чтобы повторить попытку, и продолжайте попытки до тех пор, пока исключение не будет сгенерировано (доставка успешно выполнена). Я не знал, почему (хотя я мог догадаться, когда впервые увидел это), Netbeans предупредил меня о том, что спящий объект Thread внутри цикла - не лучший выбор. Затем я немного погуглил для получения дополнительной информации и нашел эту ссылку на другой Сообщение stackoverflow, которое выглядело так интересно (я никогда не слышал о класс ThreadPoolExecutor). Я читал и эту ссылку, и API, чтобы попытаться улучшить свою программу, но я еще не совсем уверен, как мне применить это в своей программе. Может ли кто-нибудь помочь в этом, пожалуйста?
РЕДАКТИРОВАТЬ: важный код:
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;
}
}
}