guava是Google开发的java API,这里面有一节,封装了多线程的一些操作。相比原生java实现的多线程,guava实现的方式更为简单,也更容易掌握。
下面看一下具体实现方法:
添加依赖pom.xml
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>21.0</version>
</dependency>
GuavaMultiThread.java
整个代码都在这个类里,下面分节解说
/**
* 生产车票
*
* @return
*/
public List<String> createTickets() {
List<String> list = new ArrayList<>();
for (int i = 0; i < 100; i++) {
list.add("车票" + i);
}
return list;
}
这里假设有100张车票
public void sellTicket() {
List<String> list = createTickets();//获取车票
List<ListenableFuture<Integer>> futures = Lists.newArrayList();
ExecutorService pool = Executors.newFixedThreadPool(10);//定义线程数
ListeningExecutorService executorService = MoreExecutors.listeningDecorator(pool);
for (int i = 0; i < list.size(); i++) {
futures.add(executorService.submit(new Task(list.get(i))));
}
final ListenableFuture<List<Integer>> resultsFuture = Futures.successfulAsList(futures);
try {//所有都执行完毕
resultsFuture.get();
} catch (Exception e) {
e.printStackTrace();
} finally {
System.out.println("操作完毕");
pool.shutdown();
}
}
这是具体多线程执行的方法,还是比较容易理解的。首先获取要售的票,然后定义futures ,用于获取线程执行的结果。定义线程池ExecutorService ,固定值,这里设为10,定义监听执行线程池的类ListeningExecutorService
futures.add(executorService.submit(new Task(list.get(i))));
这一句话就是开始执行多线程。
最后定义ListenableFuture
用于判断多线程什么时候全部执行完,全都执行完后,在finally
里面执行pool.shutdown();
,用于关闭线程池。这句话必须得要,不然当前线程池会一直处于启动状态。
new Task(list.get(i)
,在这个类里, 定义了一个内部类,Task,用于拆分具体执行多线程的处理过程。
/**
* 内部类,用于处理售票
*/
class Task implements Callable<Integer> {
private String ticket;
/**
* 构造方法,用于参数传递
*
* @param ticket
*/
public Task(String ticket) {
this.ticket = ticket;
}
@Override
public Integer call() throws Exception {
System.out.println("已卖" + ticket);//执行卖票过程
return 1;
}
}
也比较简单,一个构造方法,用于传参数,这个类实现Callable
接口,在这个接口的具体实现即call()
方法里面进行具体业务逻辑的处理,都处理完后,返回1。
处理结果如下所示:
多线程处理多线程在实际工作中非常重要,能极大提高处理效率。在使用guava来开发多线程处理时,一共包括以下几个步骤:
1、生成要处理的所有对象,放在List里面
2、编写内部类,实现Callable接口,在这里面写具体业务逻辑
3、多线程的设置及启动、关闭,这一段代码基本没啥变化,变的是第1、2点。
网友评论