好久没写博客,看了下上一篇发表的时间发现已是一年多前,看到消息处的小红点,点了下发现仍然有很多新朋友关注了我,给我留言,给我的博文点赞,让我发现技术分享的重要性,不仅仅是影响一个人,而是影响一群人。软件开发是一份很潮的工作,会随着历史的潮头不断奔流不息,只有屹立潮头的人才不会被淘汰。逆水行舟,不进则退,多少比你差的人比你还几倍的努力。如果你总是止步不前,拒绝新的技术,你还期望公司给你加薪,你还指望同事教你该怎么写代码还拿着比同事高的工资,即使你现在还能苟延残喘,但终究会被抛弃。
说了很多废话,只是希望自己警醒,希望认同上述观点的人同样能感受到那些每天看凌晨三点太阳的人的压力,其他不认同的人大概可以跳过直接看下面的内容。本文要写的内容是关于线程,工作中有些写业务代码的开发这块用得比较少,但是面试时面试官总喜欢问多线程相关问题,例如下面这些:
1)什么是线程
2)怎么样实现多线程
3)有没有用过线程池
4)怎么样实现一个线程池
5)不要线程池可不可以
……
这些问题大家可以思考下,本文不对上述问题进行解答。大家都知道new一个线程或者实现Ruannable接口,调度这些线程是没有返回值的,如果我们需要线程任务处理完毕会返回一个成功与否的标志,那么可以采用下面的方式
public class Task implements Callable<String> {
private int id;
public Task(int id) {
this.id = id;
}
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
@Override
public String call() throws Exception {
return "线程号:" + Thread.currentThread().getId();
}
}
线程类没有实现Runnable接口,而是实现Callable接口的call方法。
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
ArrayList<Future<String>> list = new ArrayList<Future<String>>();
for (int i =0;i<10;i++){
list.add(executorService.submit(new Task(i)));
}
for(Future<String> future : list){
System.out.println(future.get());
}
}
}
创建了一个缓存线程池(线程池的线程数会动态伸缩),将线程任务放到线程池中执行,结果被保存到Future泛型的List中。最后打印出所有线程任务的结果。
大家可以思考下线程池执行任务返回结果是同步还是异步的,这种同步或者异步的效果又是通过什么方式实现的,我们拿到的结果是否真实。