java多线程   Socket
我的主要想法是做一个服务器 可以让两个用户之间进行消息,文件传输。为此我在客户端为每个用户开辟了两个线程 一个用于文件传输一个用于消息传输,每个线程都有一个与之对应的Socket连接 同样在服务器端也为每个与它连接的客户端开了两个线程(文件传输线程,消息线程) 用来在两个客户端之间进行消息的转发。同时我将客户端与服务器端的线程都做成了死循环 以此来不断得读取传送过来的消息和文件信息。可是当我创建了一个用户时cpu的占用率就40%左右了再开一个就100% 有点崩溃了在这样下去的话,后来的什么也做不了了?

求大神们帮帮看看啊到底是哪里出了问题啊,是因为我没有将线程休眠吗?那又应该在哪里休眠呢?新手请求大家的指教

同时还有一个问题在下面代码中已经标注也请大家看看啊,小女子不胜感激。
服务器端代码
public class Server1 {
	public static void main(String[] args) {
		try {
			ServerSocket ss = new ServerSocket(9999);
			System.out.println("服务器9999号端口在监听。。");
			int a = 1;//这里的a没有任何的意义,只是为了简化代码,使第一次是消息线程连接 与之连接  第二次是文件传输线程
			while (true) {
				Socket s = ss.accept();
				if (a == 1) {
					MessageServerThread mst = new MessageServerThread(s);
					mst.start();
					System.out.println("服务器端传输消息线程开启" + mst.getName());
					a = 2;
				} else if (a == 2) {
					TransportFileServerThread tfst = new TransportFileServerThread(
							s);
					tfst.start();
					System.out.println("服务器端传输文件线程开启" + tfst.getName());
					a = 1;
				}
			}
		} catch (
IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
客户端代码:
public class LoginFrame {
	public static void main(String[] args) {
		// 启动两个线程
		Socket s;
		try {
			// 用户1
			s = new Socket("127.0.0.1", 9999);
			MessageClientThread mct = new MessageClientThread(s);
			mct.start();
			System.out.println("客户端1消息线程开启" + mct.getName());
			s = new Socket("127.0.0.1", 9999);
			TransportFileClientThread tfct = new TransportFileClientThread(s);
			tfct.start();
			System.out.println("客户端1文件传输线程开启" + tfct.getName());
		} catch (
UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
客户端文件传输线程代码:
public class TransportFileClientThread extends Thread {
	Socket s;
	public TransportFileClientThread(Socket s) {
		this.s = s;
	}
    public void run() {
		while (true) {
			try {
				DataInputStream dis = new DataInputStream(
						new BufferedInputStream(s.getInputStream()));
				//之后将文件保存在本地
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}
客户端消息线程代码:
public class MessageClientThread extends Thread {
	Socket s;
	public MessageClientThread(Socket s) {
		this.s = s;
	}
	public void run() {
		while (true) {
			try {
				ObjectInputStream ois = new ObjectInputStream(
						s.getInputStream());
//之后处理得到的消息
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}