聊聊java中的线程

举报
周杰伦本人 发表于 2022/11/29 23:31:56 2022/11/29
【摘要】 聊聊java中的线程 线程的实现方式 启动线程 join()方法 总结 聊聊java中的线程坚持原创,写好每一篇文章随着用户量的逐渐增多,请求越来越多,并发问题随之而来,线程的学习自然也成了重点内容,也是出去找工作不得不进行准备的知识点。 线程的实现方式对于线程的实现方式是一个老生常谈的问题了,可以通过实现Runnable接口重写run()方法实现,可以实现Callable接口,也可以继承...

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

线程中有个join()方法,这个方法可以在一定程度上保持线程的顺序性,谁调用了join()方法,这个线程就会强行占用cpu,执行完成后其他线程再执行。

总结

这篇文章我们讲了线程的一些知识点,包括常见的几种线程实现方式,,其中对runable接口和Callable接口实现的线程不同点做了介绍,以及使用线程池来创建线程,启动线程,最后介绍了一个让线程保证一定顺序的方法join()方法,谁调用了join()方法,谁就可以优先占用CPU。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。