을 run()
메서드로 업데이트하는 코드가 있습니다.JTextArea가 멀티 스레딩에서 작동하지 않습니다. -
그러나 run
메서드를 실행하면 append()
메서드가 실행되지 않습니다.
incomingMessage
의 커서 값을 인쇄하지만 JTextArea
에는 추가되지 않습니다.
public void run()
{
while (true)
{
try
{
if(serverSocketMessage==null)
{
serverSocketMessage = new ServerSocket(Constants.INCOMING_MESSAGE_PORT);
}
System.out.println("Listening to incoming messages");
ObjectInputStream objectInputSender;
String incomingMessage = null;
serverMessage = serverSocketMessage.accept();
objectInputSender = new ObjectInputStream(serverMessage.getInputStream());
Object objectMessage = objectInputSender.readObject();
if (objectMessage instanceof String)
{
incomingMessage = objectMessage.toString();
System.out.println("\nMessage\n"+incomingMessage);
if(incomingMessage!= null)
{
chatingJTextArea.append(incomingMessage);
System.out.println("Not null");
}
chatingJTextArea.append("\n");
chatingJTextArea.append(incomingMessage);
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
JTextArea의 추가 메서드는 Swing의 스레드 안전 규칙에 대한 예외입니다. http://docs.oracle.com/javase/6/docs/api/javax/swing/JTextArea.html#append(java.lang.String) 문서에 따르면 다른 스레드에서 JTextArea를 추가 할 수 있습니다. – Bill
@Bill은 JDK7 javadoc에서 해당 주석을 제거했습니다. 그리고 내 자신의 경험으로 볼 때 이전 JDK에서는 스레드가 안전하지 않았던 것 같습니다 – Robin
흥미 롭습니다. 정보 주셔서 감사합니다! – Bill