Witam!
Chcę zrobić server, który ma 3 wątki - jeden czeka na połączenie klienta aby przekazać obraz, drugi czeka na sygnał wyłączenia X, trzeci czeka na połączenia klienta aby wysłać uruchomione procesy. Niestety nie działa mi to w jednym czasie - tylko wchodzi w pierwszy wątek - czekanie dla wysłania procesów. Jak to naprawić?

Kod:

package displayserver;

import java.net.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.util.List;

public class DisplayServer extends Thread {
	ServerSocket ss = null;
	ServerSocket admin = null;
	ServerSocket proc = null; // do procesów
	Vector<ClientThread> clientList = new Vector<ClientThread>();
	long sleepInterval = 125;

	public DisplayServer(long interval) throws Exception {
		ss = new ServerSocket(2020);
		admin = new ServerSocket(2021);
		proc = new ServerSocket(2022); // socket do procesów
		sleepInterval = interval;
		this.setPriority(MIN_PRIORITY);
		this.start();
		
		startProc();
		startServer();
	}

	private void startServer() {
		Socket client = null;
		System.err.println("Video czeka na klienta");
		ClientThread ct = null;
		while (true) {
			try {
				client = ss.accept();
				ct = new ClientThread(client);
				clientList.addElement(ct);
				ct.start();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}

	private void startProc() {
		Socket client = null;
		System.err.println("Czekanie na żądanie procesów");
		ProcThread pt = null;
		while (true) {
			try {
				client = proc.accept();
				pt = new ProcThread(client);
				pt.start();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}
	
	public void run() {
		String localHost = "127.0.0.1";
		try {
			localHost = InetAddress.getLocalHost().getHostAddress();
		} catch (Exception ex) {
		}
		while (true) { // zamykanie serwera przy otrzymaniu X
			try {
				Socket ad = admin.accept();
				if (ad.getInetAddress().getHostAddress().equals(localHost)
						&& ad.getInputStream().read() == 'X') {
					ss.close();
					for (int i = 0, n = clientList.size(); i < n; i++)
						clientList.get(i).client.close();
					System.exit(0);
				}
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}

	private void removeMe(Socket s) {
		clientList.removeElement(s);
	}

	class ClientThread extends Thread {
		Socket client = null;
		ObjectOutputStream os = null;
		InputStream is = null;

		public ClientThread(Socket s) {
			client = s;
			try {
				os = new ObjectOutputStream(s.getOutputStream());
				is = s.getInputStream();
				System.out.println("Client from "
						+ s.getInetAddress().getHostAddress() + " connected");
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}

		public void run() {
			java.awt.image.BufferedImage img = null;
			Robot r = null;
			try {
				r = new Robot();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
			Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
			Rectangle rect = new Rectangle(0, 0, size.width, size.height);
			javax.swing.ImageIcon icon = null;

			while (true) {
				try {
					System.gc();
					img = r.createScreenCapture(rect);
					icon = new javax.swing.ImageIcon(img);
					os.writeObject(icon);
					os.flush();
					icon = null;
					System.gc();
					try {
						Thread.currentThread().sleep(sleepInterval);
					} catch (Exception e) {
					}
				} catch (Exception ex) {
					closeAll();
					break;
				}
			}
		}

		private void closeAll() {
			DisplayServer.this.removeMe(client);
			try {
				os.close();
				is.close();
				client.close();
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}
	}

	public static void main(String arg[]) throws Exception {
		long interval = 80;
		if (arg.length == 1)
			interval = Long.parseLong(arg[0]);
		new DisplayServer(interval);
	}
	
	
	
	
	
	
	
	class ProcThread extends Thread {
		Socket client = null;
		ObjectOutputStream oos = null;
		InputStream is = null;

		
		ObjectInputStream ois = null;
		
		public ProcThread(Socket s) {
			client = s;
			try {
				ois = new ObjectInputStream(client.getInputStream());
				oos = new ObjectOutputStream(client.getOutputStream());
			} catch (Exception ex) {
				ex.printStackTrace();
			}
		}

		public void run() {
			
			

			while (true) {
				try {
					
					String message = (String) ois.readObject();
					List<String> processes = listRunningProcesses();
					String result = "";
					Iterator<String> it = processes.iterator();
					while (it.hasNext()) {
						result += it.next() + "\n";
					}
					
					// write object to Socket
					oos.writeObject(result);
					// close resources
					ois.close();
					oos.close();
					client.close();
					
				} catch (Exception ex) {
					//closeAll();
					break;
				}
			}
		}
	}
	
	
	
	// lista procesów
	public static List<String> listRunningProcesses() {
	    List<String> processes = new ArrayList<String>();
	    try {
	      String line;
	      Process p = Runtime.getRuntime().exec("tasklist.exe /fo csv /nh");
	      BufferedReader input = new BufferedReader
	          (new InputStreamReader(p.getInputStream()));
	      while ((line = input.readLine()) != null) {
	          if (!line.trim().equals("")) {
	              // keep only the process name
	              line = line.substring(1);
	              processes.add(line.substring(0, line.indexOf("\"")));
	          }

	      }
	      input.close();
	    }
	    catch (Exception err) {
	      err.printStackTrace();
	    }
	    return processes;
	  }
}