天天看点

聊聊java中的线程

聊聊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()方法

总结

❤️ 感谢大家

  1. 欢迎关注我❤️,点赞👍🏻,评论🤤,转发🙏
  2. 关注

    盼盼小课堂

    ,定期为你推送好文,还有群聊不定期抽奖活动,可以畅所欲言,与大神们一起交流,一起学习。
  3. 有不当之处欢迎批评指正。