在下面的代码中,为什么JVM与其他线程相比给予特定线程更多的时间?

当我运行这两个代码时,只有当我按下GUI中的发送按钮时,包含可运行代码的线程才会生效。但是我读到JVM随机选择线程并给每个线程提供时间,但是这里似乎JVM给了更多时间要运行的GUI和包含runnable的线程只有在按下发送按钮时才会获得时间。

客户代码 –

import java.io.*; import java.net.*; import java.util.*; import javax.swing.*; import java.awt.*; import java.awt.event.*; 

public class SimpleChatClient {

 JTextArea incoming; JTextField outgoing; BufferedReader reader; PrintWriter writer; Socket sock; public static void main(String[] args) { SimpleChatClient client = new SimpleChatClient(); client.go(); } public void go() { JFrame frame = new JFrame("Ludicrously Simple Chat Client"); JPanel mainPanel = new JPanel(); incoming = new JTextArea(15,30); incoming.setLineWrap(true); incoming.setWrapStyleWord(true); incoming.setEditable(false); JScrollPane qScroller = new JScrollPane(incoming); qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS); qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); outgoing = new JTextField(20); JButton sendButton = new JButton("Send"); sendButton.addActionListener(new SendButtonListener()); mainPanel.add(qScroller); mainPanel.add(outgoing); mainPanel.add(sendButton); setUpNetworking(); Thread readThread = new Thread(new IncomingReader()); readThread.start(); frame.getContentPane().add(BorderLayout.CENTER , mainPanel); frame.setSize(400,500); frame.setVisible(true); } private void setUpNetworking() { try{ String ip; ip = "localhost"; sock = new Socket(ip,5000); InputStreamReader streamReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(streamReader); writer = new PrintWriter(sock.getOutputStream()); System.out.println("networking established"); }catch(IOException ex) { ex.printStackTrace(); } } public class SendButtonListener implements ActionListener { public void actionPerformed(ActionEvent ev) { try{ writer.println(outgoing.getText()); writer.flush(); }catch(Exception ex) { ex.printStackTrace(); } outgoing.setText(""); outgoing.requestFocus(); } } public class IncomingReader implements Runnable { public void run() { int i = 0; String message; try{ while((message = reader.readLine())!=null) { 

/*THIS THREAD RUNS ONLY WHEN I PRESS SEND BUTTON IN GUI */

  System.out.println("YES YES I am HERE"); System.out.println("read " + message); incoming.append(message + "\n"); System.out.println("There"); ++i; System.out.println(i); } }catch(Exception ex){ex.printStackTrace();} } } 

}

服务器代码 –

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

public class VerySimpleChatServer {

 ArrayList clientOutputStreams; public class ClientHandler implements Runnable { BufferedReader reader; Socket sock; public ClientHandler(Socket clientSocket) { try{ sock = clientSocket; InputStreamReader isReader = new InputStreamReader(sock.getInputStream()); reader = new BufferedReader(isReader); }catch(Exception ex){ex.printStackTrace();} } public void run() { String message; try{ while((message = reader.readLine())!=null) { System.out.println("read " + message); tellEveryone(message); } }catch(Exception ex){ex.printStackTrace();} } } public static void main(String[] args) { new VerySimpleChatServer().go(); } public void go() { clientOutputStreams = new ArrayList(); try{ ServerSocket serverSock = new ServerSocket(5000); while(true) { Socket clientSocket = serverSock.accept(); PrintWriter writer = new PrintWriter(clientSocket.getOutputStream()); clientOutputStreams.add(writer); Thread t = new Thread(new ClientHandler(clientSocket)); t.start(); System.out.println("got a connection"); } }catch(Exception ex) { ex.printStackTrace(); } } public void tellEveryone(String message) { Iterator it = clientOutputStreams.iterator(); while(it.hasNext()) { try{ PrintWriter writer = (PrintWriter) it.next(); writer.println(message); writer.flush(); }catch(Exception ex) { ex.printStackTrace(); } } } 

}