SwingUtilities.invokeLater(new CWWatcher(in, target, this)); import java.io.BufferedReader; public class CWWatcher extends Thread implements Runnable { BufferedReader in; String target; CSChatWindow parent; CWWatcher(BufferedReader in, String target, CSChatWindow parent) { this.in = in; this.target = parent.getTarget(); this.parent = parent; } public void run() { int i=0; while (true) { System.out.println(i); try { //if (in.ready()) { String tmp = in.readLine(); System.out.println(tmp); if (tmp.length()>0) { parent.getOutputTextArea().append(target + " said: " + tmp + "\n"); in.mark(0); in.reset(); //} } } catch (java.io.IOException e) { System.out.println(e.getMessage()); } catch (NullPointerException e) { System.out.println(e.getMessage()); } try { sleep(1000); } catch (InterruptedException e) { System.out.println(e.getMessage()); } i++; } } } CWWatcher.run() is looping infinitely, as it should do...but it's blocking all updates to the GUI, and I can't even type anything or do anything else.