线程池创建的四种方法是什么和什么,线程池创建的四种方法是什么原理
如何解决写爬虫IP受阻的问题?立即使用。
线程池创建的四种方法
Java执行器提供了四个线程池,即:
1、使用newCachedThreadPool
NewCachedThreadPool创建一个可缓存的线程池。如果线程池的长度超过处理需要,它可以灵活地回收空闲线程。如果没有回收,它可以创建新的线程。
这种类型的线程池的特点是:
创建的工作线程数量几乎没有限制(事实上,是有限制的,数量是整数。MAX_VALUE),可以灵活地将线程添加到线程池中。
如果长时间没有向线程池提交任务,也就是说,如果工作线程空闲了指定的时间(默认为1分钟),工作线程将自动终止。终止后,如果您提交一个新任务,线程池将重新创建一个工作线程。
在使用CachedThreadPool时,一定要注意控制任务的数量,否则会有大量线程同时运行,可能会造成系统瘫痪。
示例代码如下:
包装测试;
导入Java . util . concurrent . executorservice;
导入Java . util . concurrent . executors;
公共类ThreadPoolExecutorTest {
公共静态void main(String[] args) {
ExecutorService cachedThreadPool=executors . newcachedthreadpool();
for(int I=0;i 10i ) {
final int index=I;
尝试{
Thread.sleep(索引* 1000);
} catch (InterruptedException e) {
e . printstacktrace();
}
cachedthreadpool . execute(new Runnable(){
公共无效运行(){
system . out . println(index);
}
});
}
}
}2、使用newFixedThreadPool
用指定数量的工作线程创建一个线程池。每次提交任务时,都会创建一个工作线程。如果工作线程的数量达到线程池的初始最大值,提交的任务将存储在池队列中。
FixedThreadPool是一个典型而优秀的线程池,具有提高程序效率和节省创建线程成本的优点。但是,当线程池空闲时,即线程池中没有可运行的任务时,它不会释放工作线程,也会占用一些系统资源。
示例代码如下:
包装测试;
导入Java . util . concurrent . executorservice;
导入Java . util . concurrent . executors;
公共类ThreadPoolExecutorTest {
公共静态void main(String[] args) {
ExecutorService cachedThreadPool=executors . newcachedthreadpool();
for(int I=0;i 10i ) {
final int index=I;
尝试{
Thread.sleep(索引* 1000);
} catch (InterruptedException e) {
e . printstacktrace();
}
cachedthreadpool . execute(new Runnable(){
公共无效运行(){
system . out . println(index);
}
});
}
}
}因为线程池大小为3,每个任务在睡眠2秒后输出index,所以每两秒打印3个数字。
固定线程池的大小最好根据runtime.getruntime()等系统资源来设置。可用处理器()。
3、使用newSingleThreadExecutor
创建单线程执行器,即只创建一个唯一的工作线程来执行任务。它将只使用唯一的工作线程来执行任务,确保所有任务都按照指定的顺序(FIFO、LIFO、priority)执行。如果这个线程异常结束,它将被另一个线程替换,以确保顺序执行。单个工作线程最大的特点就是可以保证每个任务的顺序执行,在任何给定的时间都不会有多个线程处于活动状态。
示例代码如下:
包装测试;
导入Java . util . concurrent . executorservice;
导入Java . util . concurrent . executors;
公共类ThreadPoolExecutorTest {
公共静态void main(String[] args) {
ExecutorService singleThreadExecutor=executors . newsinglethreadexecutor();
for(int I=0;i 10i ) {
final int index=I;
singleThreadExecutor.execute(新的Runnable() {
公共无效运行(){
尝试{
system . out . println(index);
线程.睡眠(2000年);
} catch (InterruptedException e) {
e . printstacktrace();
}
}
});
}
}
}4、使用newScheduledThreadPool
创建一个定长的线程池,而且支持定时的以及周期性的任务执行,支持定时及周期性任务执行。
延迟3秒执行,延迟执行示例代码如下:
包装测试;
导入Java。util。并发。遗嘱执行人;
导入Java。util。并发。scheduledexecutorservice
导入Java。util。并发。时间单位;
公共类ThreadPoolExecutorTest {
公共静态void main(String[] args) {
ScheduledExecutorService scheduledThreadPool=executors。newscheduledthreadpool(5);
scheduledthreadpool。计划(新的Runnable(){
公共无效运行(){
System.out.println("延迟3秒");
}
},3,时间单位。秒);
}
}表示延迟一秒后每3秒执行一次,定期执行示例代码如下:
包装测试;
导入Java。util。并发。遗嘱执行人;
导入Java。util。并发。scheduledexecutorservice
导入Java。util。并发。时间单位;
公共类ThreadPoolExecutorTest {
公共静态void main(String[] args) {
ScheduledExecutorService scheduledThreadPool=executors。newscheduledthreadpool(5);
scheduledthreadpool。scheduleatfixedrate(new Runnable(){
公共无效运行(){
System.out.println(延迟一秒,每3秒执行一次);
}
},1,3,时间单位。秒);
}
}更多编程相关知识,请访问:编程学习网站!以上就是线程池创建的四种方法是什么的详细内容,更多请关注我们其它相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。