聊聊java中的线程
坚持原创,写好每一篇文章
随着用户量的逐渐增多,请求越来越多,并发问题随之而来,线程的学习自然也成了重点内容,也是出去找工作不得不进行准备的知识点。
线程的实现方式
对于线程的实现方式是一个老生常谈的问题了,可以通过实现Runnable接口重写run()方法实现,可以实现Callable接口,也可以继承Thread类来实现。Runnable和Callable的区别在于前者执行任务后不返回数据,而实现Callable接口的线程执行任务后可以返回结果数据。
具体而言,定义XppCallable类,实现Callable接口,需要重写的是call()方法,这个方法就是定义返回的数据值。
ExecutorService exec = Executors.newCachedThreadPool();
ArrayList<Future<String>> results =
new ArrayList<Future<String>>();
for(int i = 0; i < 10; i++)
results.add(exec.submit(new XppCallable(i)));
通过定义线程池执行线程后,XppCallable线程的所有结果集都会保存到了这个results结果集合中。由于这个结果集是个所有线程的结果集的累加,所以我们在进行遍历这个集合的时候有可能被阻塞,因为有可能线程还没有返回结果,它就一直在那里等着。
for(Future<String> fs : results){
System.out.println(fs.get());
}
这里是调用Future接口中的get()方法来获取值,除此以外,Future接口还提供了包含超时时间的get()方法和检测线程是否完成任务的方法isDone()方法。
启动线程
对于线程的启动直接new Thread()创建线程然后调用start()方法启动就可以了。我们还可以使用线程池创建Executor执行器来还在线程,具体是调用ExecutorService实例的execute()方法
代码如下所示:
public static void main(String[] args) {
ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 6; i++)
exec.execute(new XppThread());
exec.shutdown();
}
对于线程池的分类也是老生常谈的东西,这里用到的是可缓存的线程池,超过一定长度会回收空闲的线程池,除此以外,还有固定线程数量的线程池,只有一个线程的线程池。
join()方法
总结
❤️ 感谢大家
- 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏
- 关注
,定期为你推送好文,还有群聊不定期抽奖活动,可以畅所欲言,与大神们一起交流,一起学习。盼盼小课堂
- 有不当之处欢迎批评指正。