栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 线程池的使用【三】【Executors】

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 线程池的使用【三】【Executors】

跳转链接:Java 线程池的使用【一】【Executor】

跳转链接:Java 线程池的使用【二】【ThreadPoolExecutor 】

一、使用Executors创建四种线程池:

Executors类提供工厂方法用来创建不同类型的线程池,实际上Executors创建的四种线程底层的实现都是通过ThreadPoolExecutor实现的。

ExecutorService executorService = Executors.具体类型的线程池;

通过调用返回值ExecutorService类的submit方法,将具体执行的线程任务传入到线程池中并执行。

线程任务的创建:跳转链接(下面例子都以Runnable接口为例)。

1)newCachedThreadPool

创建一个可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。对于执行很多短期异步任务的程序而言,这些线程池通常可提高程序性能。

调用execute将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有60s未被使用的线程。因此,长时间保持空闲的线程池不会使用任何资源。

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

cachedThreadPool.submit(new Runnable() {
    @Override
    public void run() {
        System.out.println("newCachedThreadPool");
    }
});

2)newFixedThreadPool

创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在任意点,在大多数nThreads线程会处于处理任务的活跃状态。如果在所有线程处于活动状态时提交附加任务,则在有可用线程之前,附加任务将在队列中等待。如果在关闭前的执行期间由于失败而导致任何线程终止,那么一个新的线程将代替它执行后续的任务(如果需要)。在某个线程被显示地关闭之前,池中的线程将一直存在。

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(2);

fixedThreadPool.submit(new Runnable() {
    @Override
    public void run() {
        System.out.println("newFixedThreadPool");
    }
});

3)newSingleThreadExecutor

创建一个只有一个线程的线程池,这个线程池可以在线程死亡后(或发生异常时)重新启动一个线程来替代原来的线程继续执行下去。

ExecutorService singleThreadPool = Executors.newSingleThreadExecutor();

singleThreadPool.submit(new Runnable() {
    @Override
    public void run() {
        System.out.println("newSingleThreadExecutor");
    }
});

4)newScheduledThreadPool

创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。

ScheduledExecutorService scheduledThreadPool= Executors.newScheduledThreadPool(3); 

scheduledThreadPool.submit(new Runnable() {
    @Override
    public void run() {
        System.out.println("");
    }
});

scheduledThreadPool.schedule(new Runnable() {
	@Override 
	public void run() {
		System.out.println("延迟三秒,只执行一次");
	}
}, 3, TimeUnit.SECONDS);

scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
	@Override 
	public void run() {
		System.out.println("延迟一秒后,每三秒执行一次");
	}
}, 1, 3, TimeUnit.SECONDS);

scheduledThreadPool.scheduleWithFixedDelay(new Runnable() {
    @Override
    public void run() {
		System.out.println("延迟一秒后,等当前任务执行完毕后,推迟三秒后再执行一次");
    }
}, 1, 3, TimeUnit.SECONDS);

总结:

  • schedule方法是创建并执行在给定延迟后启用的一次性操作,只执行一次,第一个参数可以传入Callable接口或Runnable接口。
  • scheduleAtFixedRate方法是固定的频率来执行某项计划,它不受每次计划执行时间的影响。到时间,它就执行;
  • scheduleWithFixedDelay方法,是相对任务。即无论当前任务执行多长时间,等执行完了,我再延迟指定的时间后再执行下一次,它受计划执行时间的影响。

三、停止线程池:

shutdown()方法调用后,线程池不再接收新任务,并且会将线程池中所有的任务执行后自动停止。

shutdownNow()方法调用后,线程池会强制中断所有线程立即停止。

四、线程池的ThreadFactory:

ThreadFactory简单来说就是用来创建线程的,其中也只是有一个newthread方法。

一些常用的作用:

  • 给线程命名,查看创建线程数
  • 给线程设置是否是后台运行
  • 设置线程优先级

1)创建ThreadFactory的实现(也可以直接使用匿名内部类的方式实现)

public class MyThreadFactory implements ThreadFactory{

    private final boolean isDaemon;
    
    MyThreadFactory(boolean isDaemon){
        this.isDaemon = isDaemon;
    }

    @Override
    public Thread newThread(Runnable r) {
        Thread newThread = new Thread(r);
        newThread.setDaemon(isDaemon);
        return newThread;
    }
}

2)将ThreadFactory传入线程池:

public static void main(String[] args) {
	ExecutorService threadPool = Executors.newFixedThreadPool(3, 
			new MyThreadFactory(true));
    threadPool.execute(new Runnable() {
        @Override
        public void run() {
            System.out.println("");
        }
    });
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/855277.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号