线程学的不好,想问一下,怎么在一个程序中控制同时运行的线程的数量,是不是要用到同步操作等等相关的方法
最好有实例程序参看一下
谢谢!

解决方案 »

  1.   

    在生成一个线程的时候计算器就加一,通过判断计数器的值决定是否生成新的线程。java编程思想里面有类似的例子。
      

  2.   

    //: c15:MultiJabberServer.java
    // A server that uses multithreading 
    // to handle any number of clients.
    import java.io.*;
    import java.net.*;class ServeOneJabber extends Thread {
      private Socket socket;
      private BufferedReader in;
      private PrintWriter out;
      public ServeOneJabber(Socket s) 
          throws IOException {
        socket = s;
        in = 
          new BufferedReader(
            new InputStreamReader(
              socket.getInputStream()));
        // Enable auto-flush:
        out = 
          new PrintWriter(
            new BufferedWriter(
              new OutputStreamWriter(
                socket.getOutputStream())), true);
        // If any of the above calls throw an 
        // exception, the caller is responsible for
        // closing the socket. Otherwise the thread
        // will close it.
        start(); // Calls run()
      }
      public void run() {
        try {
          while (true) {  
            String str = in.readLine();
            if (str.equals("END")) break;
            System.out.println("Echoing: " + str);
            out.println(str);
          }
          System.out.println("closing...");
        } catch(IOException e) {
          System.err.println("IO Exception");
        } finally {
          try {
            socket.close();
          } catch(IOException e) {
            System.err.println("Socket not closed");
          }
        }
      }
    }public class MultiJabberServer {  
      static final int PORT = 8080;
      public static void main(String[] args)
          throws IOException {
        ServerSocket s = new ServerSocket(PORT);
        System.out.println("Server Started");
        try {
          while(true) {
            // Blocks until a connection occurs:
            Socket socket = s.accept();
            try {
              new ServeOneJabber(socket);
            } catch(IOException e) {
              // If it fails, close the socket,
              // otherwise the thread will close it:
              socket.close();
            }
          }
        } finally {
          s.close();
        }
      } 
    } //: c15:MultiJabberClient.java
    // Client that tests the MultiJabberServer
    // by starting up multiple clients.
    import java.net.*;
    import java.io.*;class JabberClientThread extends Thread {
      private Socket socket;
      private BufferedReader in;
      private PrintWriter out;
      private static int counter = 0;
      private int id = counter++;
      private static int threadcount = 0;
      public static int threadCount() { 
        return threadcount; 
      }
      public JabberClientThread(InetAddress addr) {
        System.out.println("Making client " + id);
        threadcount++;
        try {
          socket = 
            new Socket(addr, MultiJabberServer.PORT);
        } catch(IOException e) {
          System.err.println("Socket failed");
          // If the creation of the socket fails, 
          // nothing needs to be cleaned up.
        }
        try {    
          in = 
            new BufferedReader(
              new InputStreamReader(
                socket.getInputStream()));
          // Enable auto-flush:
          out = 
            new PrintWriter(
              new BufferedWriter(
                new OutputStreamWriter(
                  socket.getOutputStream())), true);
          start();
        } catch(IOException e) {
          // The socket should be closed on any 
          // failures other than the socket 
          // constructor:
          try {
            socket.close();
          } catch(IOException e2) {
            System.err.println("Socket not closed");
          }
        }
        // Otherwise the socket will be closed by
        // the run() method of the thread.
      }
      public void run() {
        try {
          for(int i = 0; i < 25; i++) {
            out.println("Client " + id + ": " + i);
            String str = in.readLine();
            System.out.println(str);
          }
          out.println("END");
        } catch(IOException e) {
          System.err.println("IO Exception");
        } finally {
          // Always close it:
          try {
            socket.close();
          } catch(IOException e) {
            System.err.println("Socket not closed");
          }
          threadcount--; // Ending this thread
        }
      }
    }public class MultiJabberClient {
      static final int MAX_THREADS = 40;
      public static void main(String[] args) 
          throws IOException, InterruptedException {
        InetAddress addr = 
          InetAddress.getByName(null);
        while(true) {
          if(JabberClientThread.threadCount() 
             < MAX_THREADS)
            new JabberClientThread(addr);
          Thread.currentThread().sleep(100);
        }
      }
    }
      

  3.   

    1)同步一个数不太好,没有wait和notify机制;
    2)同步一组Object,这组Object的数量就是想控制的线程数,为了执行线程,需要得到这个Object的使用权,即Object.wait()的时候是不能用的,只有Object没有被wait()或者被某个线程notify()/notifyAll()的时候才能用.
      

  4.   

    yyouyou(一塌) ( ) 信誉:100 
    的例子有一点不好, 
    while(true) {
          if(JabberClientThread.threadCount() 
             < MAX_THREADS)
            new JabberClientThread(addr);
          Thread.currentThread().sleep(100);
        }
    ,这是通过轮循的机制,主线程相当于是一直在执行的.而wait/notify机制,能更有效的共享CPU.