多线程的核心思想:首先创建线程,在线程中并发的执行任务,这些执行的任务会,线程是执行程序的,这些线程有一个线程池管理,队列是在线程池中使用到
ThreadPoolExecutor是线程池中的具体的实现类,这个类中有一些具体的方法可以使用:
execute(Runnable command)
: 将任务提交到线程池中执行。submit(Callable<T> task)
: 将任务提交到线程池中执行,并返回一个Future
对象,该对象可以用于获取任务执行结果。shutdown()
: 关闭线程池,不再接受新的任务。shutdownNow()
: 关闭线程池,并尝试停止所有正在执行的任务。getActiveCount()
: 获取当前正在执行任务的线程数量。getTaskCount()
: 获取已经提交到线程池中的任务数量。
具体的使用方法如下:
static{
BlockingQueue<Runnable> workQueue = new LinkedBlockingDeque<Runnable>(10000);
threadPool = new ThreadPoolExecutor(processorCount * 20, processorCount * 1000, 1, TimeUnit.MINUTES, workQueue, new NamedThreadFactory("sutu-thread-pool"));
}
public static ThreadPoolExecutor getThreadPool(String why){
if(logger.isInfoEnabled()){
logger.debug("准备申请线程资源执行[" + why + "]");
}
return threadPool;
}
CommonThreadPool.getThreadPool("同步Coupang店铺订单状态" + shop.getShopId()).execute(new InnerOrderStateSyncTask(shop, enterpriseId))
这个例子中是使用了阻塞队列放入到线程池中。
建议
多线程的使用场景,首先这个任务要是需要长时间执行的并且可以拆分成多个任务的,每个任务之间没有联系。如果有其他的函数需要等待多线程执行得到结果才能继续执行,则应该考虑保序等问题了。