thread.getId()是当前执行线程的ID,每个线程有自己的ID,当一个线程执行完被销毁后,它拥有的ID会被重新分配给其他线程。
内存
- 线程池中维护一定数量的线程,进行重复利用。(减少创建、启动、销毁线程的开销)
- 线程从任务队列中取任务执行
Java中的线程池
工具类Executors:
工具类Executors中方法
创建固定线程数的线程池
创建有调度功能的线程池
有执行时间、频率的调度(类似定时器Timer)
scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) (同于Timer的schedule()作业调度)
scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)(这个是在任务执行结束后才进行计时delay,与scheduleAtFixedRate()不同)
核心线程池的底层实现
Executors工具类中的newCachedThreadPool(),newSingleThreadExcecutor(),newFixedThreadPool()底层源码都由ThreadPoolExecutor类实现
接口BlockingQueue < E >
这些都在java.util.concurrent包下有实现类,用的时候直接new类对象就可以。
Executors工具类中的newCachedThreadPool(),newSingleThreadExcecutor(),newFixedThreadPool():
接口RejectedExecutionHandler
这几大策略都在ThreadPoolExecutor中有静态实现的内部类(其中AbortPolicy是默认类)用的时候直接new内部类对象就可以
接口ThreadFactory
线程池中的线程是由ThreadFactory创建的, 在Executors中实现了下面两个内部类 :
总结
我们只需做到最基本的以下三点:
- 创建线程池:ExecutorService executorService = Executors.new…();
- 创建任务:Runnable r = new Runnable(){ run()…任务…}
- 将任务提交给线程池就可以了:executorService.submit( r );或executorService.execute( r );