リモートコントロールに小さなアプリケーションを書き込んでいます。(Behringer x32)ミキシングコンソール。そして私はコミュニケーションに問題がありました。マルチスレッドスレッド再開
私はPC(アプリケーション)からコンソール(ポート10023 UDPプロトコル)にデータを送信していますが、コンソールからのデータは、送信データ(ランダムポート)からのポートに応答します。 私はデータを送信するために2つのスレッドとコンソールからデータを受信するために1つのスレッドを持っています.....したがって、コンソールにデータを送信するたびにリスニングポートを変更する必要があります。スレッドをリッスンし、新しいスレッドを開始します。
しかし、しばらくしてから、アプリケーションに約x1000のスレッドが開いています。
新しいスレッドを作成せずにスレッドを再起動するか、リスニングポートを更新するにはどうすればよいですか?ここ
は、このセクションのコードですが、全体のファイルがgihub
リスニングスレッドクラス@です:
public class Receiver implements Runnable {
private List<IReceiverListener> listeners;
private final static int PACKETSIZE = 48;
private int port;
public Receiver() {
listeners = new ArrayList();
}
public void addReceiverListener(IReceiverListener listener) {
listeners.add(listener);
}
private void update(String data, String adress) {
for (IReceiverListener listener : listeners) {
listener.receiveConsoleData(data, adress);
if (data.indexOf("active") > -1) {
listener.incrementWatchDog();
}
}
}
@Override
public void run() {
try {
// Convert the argument to ensure that is it valid
// Construct the socket
while (true) {
//System.out.println("Listen on Port:" + this.port);
DatagramSocket socket = new DatagramSocket(this.port);
// Create a packet
DatagramPacket packet = new DatagramPacket(new byte[PACKETSIZE], PACKETSIZE);
// Receive a packet (blocking)
socket.receive(packet);
// Print the packet
update(new String(packet.getData()), packet.getAddress().toString());
//logger.addLogData(new String(packet.getData())+" "+packet.getAddress().toString());
// Return the packet to the sender
socket.close();
}
} catch (IOException e) {
}
}
public void setPort(int port) {
this.port = port;
}
public int getPort() {
return port;
}
}
とここに私のポートupdateFunction
@Override
public void updatePort(int port) {
receiverThread.interrupt();
receiverThread = null;
receiver.setPort(port);
receiverThread = new Thread(receiver);
receiverThread.start();
}
とし、送信スレッドこれは、データを送信するとき:
listener.updatePort(dsocket.getLocalPort());
可能な重複http://stackoverflow.com/questions/671049/how-:
そして次は、プロセスの完全な視覚化したものですdo-you-kill-a-thread-in-java) – Raedwald
スレッドを殺す別の解決策がある場合はshureしないでください –