일부 코드를 보내는 응용 프로그램에서이 코드를 사용하여 소켓을 던집니다. DataOutputStream 다른 접근 방식
public class OutgoingData {
public static DataOutputStream dos = null;
public static String toSend = "";
public static volatile boolean continuousSending = true;
public static String toSendTemp = "";
public static void startSending(final DataOutputStream d) {
new Thread(new Runnable() {
public void run() {
try {
dos = d;
while (continuousSending) {
if (!toSend.equals(toSendTemp)) {
dos.writeUTF(toSend);
dos.flush();
toSendTemp = toSend;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
그리고 다른 스레드에서
나는이 구현을 사용하여 나타날 수있는 문제가이 방법private void send(String str) {
OutgoingData.toSend = str;
}
를 호출 무엇입니까? send()가 두 스레드에서 동 기적으로 호출되는 경우를 제외하고. 이 코드는 runned되는 시스템이 잠금을 얻을하는 데 시간이 오래 프로세스가 만들 수있는 스레드의 수에 제한이 있고 걸리기 때문에
private void send(final String str){
new Thread(new Runnable() {
@Override
public void run() {
synchronized (OutgoingData.dos) {
try {
OutgoingData.dos.writeUTF(str);
OutgoingData.dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}).start();
}
:
나는 이런 식으로 뭔가를 사용하고 있지 않다 개체에.
+1 'toSend' 필드는 휘발성이 아니므로이 필드가 변경되지 않을 수도 있습니다. –
당신은이 문제가 발생하지 않았지만 이론적으로는 이것이 일어날 가능성이 더 높습니다. – Titus