今天学习下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.util.concurrent.Executors` 是Java并发编程中一个非常重要的工具类,主要用于创建不同类型的线程池对象。通过使用`Executors`类,开发者可以方便地管理和控制线程池的行为,从而提高系统的性能和资源利用率。...
使用`ThreadPoolExecutor` 创建线程池的基本代码如下: ```java int corePoolSize = 5; int maximumPoolSize = 10; long keepAliveTime = 5000; BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue(); ...
3. **线程池接口与实现**:在Java中,`java.util.concurrent.Executor` 是线程池的顶级接口,它定义了执行任务的基本方法。`ExecutorService` 是实际的线程池接口,提供了更丰富的管理和控制线程池的方法。`...
在JDK 1.5版本之前,Java对线程池的支持非常有限,而在JDK 1.5之后,加入了java.util.concurrent包,其中包含了一系列关于线程池的接口和类,极大地丰富了线程池的应用场景和管理方式。 线程池的主要作用是限制系统...
使用线程池查询大批量数据的基本步骤如下: 1. **创建线程池**:首先,我们需要创建一个线程池实例。通常,我们可以根据实际需求设置线程池参数。例如,如果数据量大且系统资源充足,可以适当增加线程数量;反之,...
2. **提交任务**:使用`execute()`方法提交Runnable对象到线程池执行: ```java executor.execute(new Runnable() { @Override public void run() { // 执行任务逻辑 } }); ``` 3. **关闭线程池**:当不再...
- **线程池管理器**:负责创建和管理线程池,包括初始化线程池、添加任务到线程池以及关闭线程池。 - **工作线程**:线程池中的线程,当没有任务时,它们会处于等待状态,一旦有任务到来,它们会被激活执行任务。 ...
线程池的关闭也很重要,使用`shutdown()`方法会停止接收新任务但会执行已提交的任务,而`shutdownNow()`则会尝试停止所有正在执行的任务。 在实际应用中,选择合适的线程池配置和优化是性能调优的关键。需要考虑的...
此外,使用完线程池后,别忘了调用`shutdown()`或`shutdownNow()`方法关闭线程池,防止内存泄漏。 通过这个"android线程池项目",你可以亲自实践如何在Android中创建线程池,提交任务,以及观察其运行效果。通过...
在Python中,`concurrent.futures`模块提供了线程池的实现,如`ThreadPoolExecutor`,使用方式类似于Java,通过`submit()`方法提交任务,并可选择性地获取`Future`对象以获取执行结果。 线程池的例子代码通常包括...
Java中,我们通常使用`Executors`类提供的静态工厂方法来创建线程池,如`newFixedThreadPool(int nThreads)`创建固定大小的线程池,`newSingleThreadExecutor()`创建只有一个线程的线程池,`newCachedThreadPool()`...
创建线程池的基本步骤如下: ```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`类进行线程池的创建和管理,以及可能通过自定义工具或框架对...
在Java中,我们可以使用`Executors`工厂类创建线程池,如`newFixedThreadPool`用于创建固定大小的线程池,`newSingleThreadExecutor`创建只有一个线程的线程池,`newCachedThreadPool`创建可缓存的线程池,等等。...
3. 关闭线程池,可以使用`shutdown()`或`shutdownNow()`,前者等待所有已提交任务完成,后者尝试停止所有正在执行的任务。 合理的线程池配置能够优化系统的并发性能,避免资源浪费,同时确保任务的稳定执行。在实际...
3. **关闭线程池**:任务执行完毕后,应调用`shutdown()`或`shutdownNow()`方法来停止接收新任务,并等待正在执行的任务完成。`shutdown()`会等待已提交任务执行完毕,而`shutdownNow()`尝试停止所有正在执行的任务...
2. **线程池中的线程(Pool Threads)**:预先创建或按需创建的一组线程,它们负责从工作队列取出并执行任务。 3. **线程工厂(Thread Factory)**:用于创建新线程的对象,可以根据需求定制线程的行为,如设置线程...
Java线程池是一种高效管理线程的技术,它允许开发者预定义一组线程,根据任务的需要灵活调度,而不是每次需要执行任务时都创建新的线程。这种设计模式大大提高了系统的性能,减少了系统资源的消耗,特别是在高并发...
- **定义**:线程池是一组预先创建的线程,用于执行多个任务,而不是为每个任务创建新的线程。这提高了系统资源的利用率,减少了线程的创建和销毁开销。 - **工作原理**:任务提交到线程池后,线程池会根据其内部...