java socket用法(二)

 package multithread2;
public class ThreadPoolTester {
public static void main(String[] args) {
if (args.length != 2) {
System.out.println("用法: java ThreadPoolTest numTasks poolSize");
System.out.println(
" numTasks - integer: 任务的数目");
System.out.println(
" numThreads - integer: 线程池中的线程数目");
return;
}
int numTasks = Integer.parseInt(args[0]);
int poolSize = Integer.parseInt(args[1]);
ThreadPool threadPool = new ThreadPool(poolSize); //创建线程池
// 运行任务
for (int i=0; i<numTasks; i++)
threadPool.execute(createTask(i));
threadPool.join(); //等待工作线程完成所有的任务
// threadPool.close(); //关闭线程池
}//#main()
/** 定义了一个简单的任务(打印ID) */
private static Runnable createTask(final int taskID) {
return new Runnable() {
public void run() {
System.out.println("Task " + taskID + ": start");
try {
Thread.sleep(500); //增加执行一个任务的时间
} catch (InterruptedException ex) { }
System.out.println("Task " + taskID + ": end");
}
};
}
}

 ThreadPoolTester 类的createTask()方法负责创建一个简单的任务。ThreadPoolTester
类的main()方法读取用户从命令行输入的两个参数,它们分别表示任务的数目和工作
线程的数目。main()方法接着创建线程池和任务,并且由线程池来执行这些任务,最后
调用线程池的join()方法,等待线程池把所有的任务执行完毕。
运行命令“java multithread2.ThreadPoolTester 5 3”,线程池将创建3 个工作线程,
由它们执行5 个任务。程序的打印结果如下:
Task 0: start
Task 1: start
Task 2: start
Task 0: end
Task 3: start
Task 1: end
Task 4: start
Task 2: end
Task 3: end
Task 4: end

从打印结果看出,主线程等到工作线程执行完所有任务后,才结束程序。如果把

main()方法中的“threadPool.join()”改为“threadPool.close()”,再运行程序,则会看到,
尽管有一些任务还没有执行,程序就运行结束了。

 

 

EchoServer 利用线程池ThreadPool 来完成与客户的通信任务。

package multithread2;
import java.io.*;
import java.net.*;
public class EchoServer {
private int port=8000;
private ServerSocket serverSocket;
private ThreadPool threadPool; //线程池
private final int POOL_SIZE=4; //单个CPU时线程池中工作线程的数目
public EchoServer() throws IOException {
serverSocket = new ServerSocket(port);
//创建线程池
//Runtime 的availableProcessors()方法返回当前系统的CPU的数目
//系统的CPU越多,线程池中工作线程的数目也越多
threadPool= new ThreadPool(
Runtime.getRuntime().availableProcessors() * POOL_SIZE);
System.out.println("服务器启动");
}
public void service() {
while (true) {
Socket socket=null;
try {
socket = serverSocket.accept();
threadPool.execute(new Handler(socket)); //把与客户通信的任务交给线程池
}catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String args[])throws IOException {
new EchoServer().service();
}
}
/** 负责与单个客户通信的任务,代码与3.6.1 节的例程3-5 的Handler类相同 */
class Handler implements Runnable{…}

在以上EchoServer 的service()方法中,每接收到一个客户连接,就向线程池
ThreadPool 提交一个与客户通信的任务。ThreadPool 把任务加入到工作队列中,工作
线程会在适当的时候从队列中取出这个任务并执行它。

你可能感兴趣的:(java,thread,.net,工作,socket)