聊聊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()方法
线程中有个join()方法,这个方法可以在一定程度上保持线程的顺序性,谁调用了join()方法,这个线程就会强行占用cpu,执行完成后其他线程再执行。
总结
这篇文章我们讲了线程的一些知识点,包括常见的几种线程实现方式,,其中对runable接口和Callable接口实现的线程不同点做了介绍,以及使用线程池来创建线程,启动线程,最后介绍了一个让线程保证一定顺序的方法join()方法,谁调用了join()方法,谁就可以优先占用CPU。
- 点赞
- 收藏
- 关注作者
评论(0)