java基础--28.线程池简介以及实际应用
Posted 大数据小小罗
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java基础--28.线程池简介以及实际应用相关的知识,希望对你有一定的参考价值。
线程池简介
程序启动一个新线程的成本是比较高的,因为它涉及到要与操作系统进行交互。
而使用线程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使用线程池。
线程池的好处:线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
在JDK5之前,我们必须手动实现自己的线程池,从JDK5开始,Java内置支持线程池
线程池的创建
JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法
public static ExecutorService newCachedThreadPool()
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newSingleThreadExecutor()
这些方法的返回值是ExecutorService对象,该对象表示一个线程池,可以执行Runnable对象或者Callable对象代表的线程。它提供了如下方法
Future<?> submit(Runnable task)
<T> Future<T> submit(Callable<T> task)
案例演示
创建线程池对象的方法
创建Runnable实例
提交Runnable实例
关闭线程池
//创建实现Runnable接口的实例对象
public class MyRunnable implements Runnable
@Override
public void run()
for (int x = 0; x < 100; x++)
System.out.println(Thread.currentThread().getName() + "--" + x);
/*
* 如何实现线程池的代码?
* A:创建一个线程池对象,控制要创建几个线程对象
* static ExecutorService newFixedThreadPool(int nThreads)
*
* B:这种线程池的线程可以执行:
* Runnable对象或者Callable对象代表的线程
* 创建一个类实现Runnable接口
*
* C:启动线程调用如下方法:
* Future<?> submit(Runnable task)
* <T> Future<T> submit(Callable<T> task)
*
* D:执行完之后想结束线程,可以吗?
* 可以
* void shutdown() 启动一次顺序关闭,执行以前提交的任务,但不接受新任务。
*/
public class ExecutorsDemo
public static void main(String[] args)
//通过工厂方法 创建一个拥有两个线程的线程池对象
ExecutorService pool = Executors.newFixedThreadPool(2);
//提交一个 Runnable 任务用于执行
pool.submit(new MyRunnable());
pool.submit(new MyRunnable());
//启动一次顺序关闭,执行以前提交的任务,但不接受新任务。结束线程池
pool.shutdown();
使用匿名内部类实现多线程
线程池的创建和使用都比较复杂,在开发中我们会尽量简化这些过程–使用匿名内部类
public class AnonymousThreadDemo
/**
* 使用匿名内部类实现多线程
*/
public static void main(String[] args)
//方式1:直接new Thread创建线程
new Thread()
public void run()
for (int x = 0; x < 100; x++)
System.out.println(Thread.currentThread().getName() + ":"+ x);
.start();
//方式2:通过Runnable接口创建线程
new Thread(new Runnable()
@Override
public void run()
for (int x = 0; x < 100; x++)
System.out.println(Thread.currentThread().getName() + ":"+ x);
)
.start();
//方式x:这种方式仅仅会出现在面试题中,运行的代码只是Thread类重写的run方法中的代码
new Thread(new Runnable()
@Override
public void run()
for (int x = 0; x < 100; x++)
System.out.println("hello" + ":"+ x);
)
@Override
public void run()
for (int x = 0; x < 100; x++)
System.out.println("world" + ":"+ x);
.start();
以上是关于java基础--28.线程池简介以及实际应用的主要内容,如果未能解决你的问题,请参考以下文章