`
nbtlxx
  • 浏览: 253683 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
社区版块
存档分类
最新评论

Concurrent线程池的基本使用:创建、执行、关闭

阅读更多
今天学习下Concurrent包内线程池的创建、任务执行和关闭,感觉有不少知识点需要总结和整理。

详见具体代码及注释
/**
 * 
 */
package network;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;


/**
 * @author sean
 * 
 *         来自jdk1.6api的参考代码
 *         主要使用线程池的创建、执行、关闭
 * @since 2009/06/13
 */
public class NetworkService implements Runnable {

	private int nThreads = 10; // 线程池大小为10
	private ExecutorService pool; // 线程池对象
	private ServerSocket serverSocket;
	private static int port = 9999;

	/**
	 * 构造函数,创建serverSocket服务器端并启动 创建固定大小的线程池
	 * 
	 * @param port
	 */
	public NetworkService(int port) {
		try {
			serverSocket = new ServerSocket(port);
			System.out.println("server is ruuning on port: " + port);
			pool = Executors.newFixedThreadPool(nThreads);

			// 启动线程
			new Thread(this).start();
			
			Timer timer = new Timer();
			TimerTask task = new TimerTask(){

				@Override
				public void run() {
					// TODO Auto-generated method stub
					shutdownAndWaitTermination(pool);
				}
				
			};
			//100s之后关闭线程池,查看具体情况
			timer.schedule(task, 10000);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	/*
	 * 线程运行体, 主要负责执行handler类的一个接收客户端连接的工作
	 * 
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			try {
				pool.execute(new Handler(serverSocket.accept()));
			} catch (IOException e) {
				// TODO 如果连接异常,关闭线程池,也是关键技术点之一
				this.shutdownAndWaitTermination(pool);
			}
		}

	}

	/**
	 * 关闭线程池的具体处理方法
	 * 1. 先拒绝新客户端连接,当前任务仍旧执行
	 * 2. shutdownAndNow(), 限定时间或者任务完成,立即关闭当前线程池
	 * @param pool
	 */
	private void shutdownAndWaitTermination(ExecutorService pool) {
		// 第一阶段,不在接收新的客户端连接
		pool.shutdown();

		try {
			// 等待若干时间给当前已经存在的任务,此处60秒
			// 等待全部执行完毕就关闭,或者等待限制时间到来,关闭线程thread.interrupt
			if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
				// 取消当前存在的任务
				pool.shutdownNow();

				if (!pool.awaitTermination(60, TimeUnit.SECONDS))
					System.err.println("Pool did not terminate");
			}

		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			pool.shutdownNow();
			// 保存中断状态
			Thread.currentThread().interrupt();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO 实例化一个对象,开始运行本程序
		new NetworkService(port);

	}

	/**
	 * 负责接收客户端后,在循环体中打印一个socket的地址
	 * 
	 * @author sean
	 * 
	 */
	class Handler implements Runnable {
		Socket socket;

		public Handler(Socket socket) {
			this.socket = socket;
		}

		@Override
		public void run() {
			// TODO Auto-generated method stub
			System.out.println("socket is accepted "
					+ socket.getRemoteSocketAddress());
		}
	}
}

分享到:
评论

相关推荐

    java 线程池管理类:Executors_.docx

    `java.util.concurrent.Executors` 是Java并发编程中一个非常重要的工具类,主要用于创建不同类型的线程池对象。通过使用`Executors`类,开发者可以方便地管理和控制线程池的行为,从而提高系统的性能和资源利用率。...

    java.util.concurrent 实现线程池队列

    使用`ThreadPoolExecutor` 创建线程池的基本代码如下: ```java int corePoolSize = 5; int maximumPoolSize = 10; long keepAliveTime = 5000; BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue(); ...

    Java中多线程的使用线程池.docx

    3. **线程池接口与实现**:在Java中,`java.util.concurrent.Executor` 是线程池的顶级接口,它定义了执行任务的基本方法。`ExecutorService` 是实际的线程池接口,提供了更丰富的管理和控制线程池的方法。`...

    Java线程池使用说明

    在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,其中包含了一系列关于线程池的接口和类,极大地丰富了线程池的应用场景和管理方式。 线程池的主要作用是限制系统...

    JAVA使用线程池查询大批量数据

    使用线程池查询大批量数据的基本步骤如下: 1. **创建线程池**:首先,我们需要创建一个线程池实例。通常,我们可以根据实际需求设置线程池参数。例如,如果数据量大且系统资源充足,可以适当增加线程数量;反之,...

    Android java 线程池

    2. **提交任务**:使用`execute()`方法提交Runnable对象到线程池执行: ```java executor.execute(new Runnable() { @Override public void run() { // 执行任务逻辑 } }); ``` 3. **关闭线程池**:当不再...

    Java 线程池的原理与实现

    - **线程池管理器**:负责创建和管理线程池,包括初始化线程池、添加任务到线程池以及关闭线程池。 - **工作线程**:线程池中的线程,当没有任务时,它们会处于等待状态,一旦有任务到来,它们会被激活执行任务。 ...

    线程池使用Demo

    线程池的关闭也很重要,使用`shutdown()`方法会停止接收新任务但会执行已提交的任务,而`shutdownNow()`则会尝试停止所有正在执行的任务。 在实际应用中,选择合适的线程池配置和优化是性能调优的关键。需要考虑的...

    android线程池项目

    此外,使用完线程池后,别忘了调用`shutdown()`或`shutdownNow()`方法关闭线程池,防止内存泄漏。 通过这个"android线程池项目",你可以亲自实践如何在Android中创建线程池,提交任务,以及观察其运行效果。通过...

    一个简单的线程池例子

    在Python中,`concurrent.futures`模块提供了线程池的实现,如`ThreadPoolExecutor`,使用方式类似于Java,通过`submit()`方法提交任务,并可选择性地获取`Future`对象以获取执行结果。 线程池的例子代码通常包括...

    线程池管理线程demo

    Java中,我们通常使用`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`...

    java线程和线程池的使用.docx

    创建线程池的基本步骤如下: ```java ExecutorService executor = Executors.newFixedThreadPool(10); // 创建一个固定大小的线程池 executor.execute(new Runnable() { @Override public void run() { // 线程...

    线程池的概念

    创建线程池的基本示例: ```java ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, // 核心线程数 maximumPoolSize, // 最大线程数 keepAliveTime, // 空闲线程存活时间 TimeUnit....

    简单线程池与线程池检查的实现

    在标签“源码”和“工具”的提示下,我们可以推测该话题可能涉及到线程池的具体实现代码,例如使用Java的`java.util.concurrent.ThreadPoolExecutor`类进行线程池的创建和管理,以及可能通过自定义工具或框架对...

    关于线程池的代码demo

    在Java中,我们可以使用`Executors`工厂类创建线程池,如`newFixedThreadPool`用于创建固定大小的线程池,`newSingleThreadExecutor`创建只有一个线程的线程池,`newCachedThreadPool`创建可缓存的线程池,等等。...

    Java并发编程:线程池的使用 - 平凡希 - 博客园1

    3. 关闭线程池,可以使用`shutdown()`或`shutdownNow()`,前者等待所有已提交任务完成,后者尝试停止所有正在执行的任务。 合理的线程池配置能够优化系统的并发性能,避免资源浪费,同时确保任务的稳定执行。在实际...

    ExecutorService线程池

    3. **关闭线程池**:任务执行完毕后,应调用`shutdown()`或`shutdownNow()`方法来停止接收新任务,并等待正在执行的任务完成。`shutdown()`会等待已提交任务执行完毕,而`shutdownNow()`尝试停止所有正在执行的任务...

    线程池Thread

    2. **线程池中的线程(Pool Threads)**:预先创建或按需创建的一组线程,它们负责从工作队列取出并执行任务。 3. **线程工厂(Thread Factory)**:用于创建新线程的对象,可以根据需求定制线程的行为,如设置线程...

    java线程池封装j

    Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,根据任务的需要灵活调度,而不是每次需要执行任务时都创建新的线程。这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发...

    线程池+socket

    - **定义**:线程池是一组预先创建的线程,用于执行多个任务,而不是为每个任务创建新的线程。这提高了系统资源的利用率,减少了线程的创建和销毁开销。 - **工作原理**:任务提交到线程池后,线程池会根据其内部...

Global site tag (gtag.js) - Google Analytics