搞懂Java线程池
简介
Java中的线程池是一种常见的并发编程工具,它可以让程序更高效地利用系统资源以及更好地进行线程管理。线程池采用预分配线程的方式,从而避免了线程的频繁创建与销毁,这样可以在一定程度上提升程序的性能。同时,线程池还可以对线程进行池化、回收、重用等操作,从而进一步提升程序的运行效率。
线程池的使用
Java线程池的使用十分简洁,可以分为几个步骤:
- 创建线程池,可以通过
Executors
类提供的静态方法来完成,也可以通过自定义线程池来创建。 - 创建一个需要并行执行的任务。
- 将任务添加到线程池中。
- 执行任务。
下面我们以几个示例来说明Java线程池的使用。
示例1:计算数字和
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class CalculateTask implements Runnable {
private int startNum;
private int endNum;
CalculateTask(int startNum, int endNum) {
this.startNum = startNum;
this.endNum = endNum;
}
public void run() {
long sum = 0;
for (int i = startNum; i <= endNum; i++) {
sum += i;
}
System.out.println(Thread.currentThread().getName() + " : " + sum);
}
}
public class ThreadPoolExample1 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.execute(new CalculateTask(1, 10));
executorService.execute(new CalculateTask(11, 20));
executorService.shutdown();
}
}
在这个示例中,我们创建了一个简单的任务类CalculateTask
,该任务用于计算某个区间内的数字和。使用Executors.newFixedThreadPool(2)
方法创建了一个固定大小为2的线程池,随后分别将CalculateTask
任务添加到线程池中并执行。
示例2:爬虫
import java.io.IOException;
import java.net.URL;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
class CrawlerTask implements Runnable {
private String url;
CrawlerTask(String url) {
this.url = url;
}
public void run() {
try {
String content = new Scanner(new URL(url).openStream(), "UTF-8").useDelimiter("\\A").next();
System.out.println(Thread.currentThread().getName() + " : " + url);
} catch (IOException e) {
System.out.println("Failed to crawl " + url);
}
}
}
public class ThreadPoolExample2 {
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(4);
String[] urls = {"https://www.baidu.com", "https://www.sogou.com", "https://www.google.com", "https://www.bing.com"};
for (String url : urls) {
executorService.execute(new CrawlerTask(url));
}
executorService.shutdown();
}
}
在这个示例中,我们创建了一个简单的爬虫任务类CrawlerTask
,该任务用于爬取某个网址的内容。使用Executors.newFixedThreadPool(4)
方法创建了一个固定大小为4的线程池,随即分别将若干个CrawlerTask
任务添加到线程池中并执行。
参考文献
以上介绍的内容只是Java线程池的冰山一角,详情可以参考Java官网关于并发编程指南的相关介绍。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:搞懂Java线程池 - Python技术站