| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 移动开发 -> Java创建和使用线程的四种方式 -> 正文阅读 |
|
|
[移动开发]Java创建和使用线程的四种方式 |
多线程创建线程的方式继承Thread类
当然如果
如果是用java8的话,我们还可以通过lambda表达式去进一步简化:
实现Runnable接口
和前面类似的做法是,如果SellTicket只用一次,不不需要显示创建的话,我们也可以用匿名内部类的方式去简写:
实现Callable接口前面说的两种方式,都可以用来创建和使用线程,但是遗憾的是,他们都没有办法带回来返回值。有些场景,我们是需要返回值的,比如:我们交给线程异步的去做一个数学计算,去做一个耗时的查询,那么我们是需要知道计算的结果或者查询到的数据的。这样的场景,我们就需要用到实现Callable接口这种方式了。参考代码: 这里需要注意的几点是:
通过上面的方式,我们已经可以获取到线程的执行结果了,那么再看这样一段代码:我们在第5行休息了5秒钟,用来模拟调用远程接口耗时或者执行业务逻辑复杂的过程。执行的结果是,第8行会一直阻塞等待结果,直到5秒结束,拿到返回结果。
这样的场景可能并不是理想的,5秒我们可以等,如果是10秒呢?1个小时呢?我们等不等,答案是否定的。古语有云,时光匆匆,如白驹过隙,我们不能把大量的时间用在等待上,那么唯一的结果就是我们变老了。我们也不能让一个线程耗在这里,什么都做不了,这也是对资源的一种浪费。因此我们有了下面的代码:我们可以通过
通过线程池的方式创建和使用线程创建一个线程,我们知道需要有线程的上下文,用来在CPU通过时间片轮转的线程调度方式调度线程的时候保存线程的一些中间数据,我们还知道在JAVA中,每一个线程会在JVM的栈区分配一个独立的线程栈,用来保存线程的局部变量、程序计数器等等。那么如果在Linux操作系统中,我们创建的线程叫做用户线程,他还需要和内核线程进行一对一或者一对多的绑定(这个根据操作系统决定),因此创建一个线程的代码很简单,但底层需要做的事情还是很多的,这些都是需要消耗资源,消耗时间成本的。那么有没有办法能创建一个线程,反复利用呢?这就是线程池的事情了。 假如你是一个老板,开了一家制作口罩的工厂。前面几种方式,就相当于有一笔订单,你就招聘一个工人,然后带她熟悉设备,教他如何制作口罩,等他熟悉了,然后做完这笔订单之后,你就开除他了。如果下次还来一个订单,你就需要又重新招聘一个工人,继续培训他,等他完成。。。这样的老板,生活中也许并不多见。 我们常见的老板是什么样的呢?你有一个生产口罩的想法,于是注册了一家公司,开个工厂,工人还没招聘,因为可能一开始没有生意嘛,招太多人可能用不上,也发不起工资。所以先去跑订单,好不容易来了一笔订单,你就招了一个工人去做。由于你干的不错,又来一个订单,那么你就又招了一个工人,就这样,有一天你的公司已经扩大到了10个人工人的规模。突然有一天,疫情爆发了,社会上需要大量的口罩,你接到了大笔的订单,但是你的10个工人都忙的晕头转向的,怎么办呢?先将这些订单按照来的顺序找个地方放着吧,你准备等工人闲下来就去做。但是情况不容乐观,疫情越来越严重了,作为一个爱国商人,你准备回报社会,抓紧生产口罩,将他们捐献到需要的地方。因此你招了很多临时工,做了简单的培训后,让他们也参与到制作口罩的队伍中。但是由于疫情太严重了,还是有源源不断的订单过来,临时工和老员工都在加班干,桌子上的订单都放满了,你也毕竟只是个普通人。该做的你已经做了,那就只能拒绝了。最后在全国人民的齐心协力下,我们战胜了病毒,人们再也不用戴口罩了。口罩的订单降下来了,你没有那么忙了,临时工也闲了,是时候让他们回家了。剩下的工作,几个老员工完全能应付过来。 这个故事就是线程池设计的思想,线程池就是那个老板,他有创建线程、管理线程的能力;老员工我们把它们叫做核心线程,这些线程被创建之后一直在线程中,随时准备处理业务逻辑;订单处理不了,暂时存放的地方,我们叫阻塞队列,和队列的区别体现在一个阻塞上,第一点:往队列中放元素的时候如果队列满,不会放弃,会阻塞等待队列有空间在尝试往进放。第二点:从队列中取元素的时候,如果队列为空,不会放弃,会阻塞等待有其他线程往队列中放入了元素,在取;临时工,我们叫临时线程,临时线程在线程池空闲下来的时候会进行释放;拒绝别人的方式有很多,直接说我不干,是一种,很容易得罪人,委婉的说明原因,客客气气的也是一种,因此关于如何拒绝的方法,线程池中我们叫做拒绝策略。 详细步骤,参考下图: 代码参考:
线程生命周期线程的生命周期:
守护线程默认创建的线程都是
|
|
|
| 移动开发 最新文章 |
| Vue3装载axios和element-ui |
| android adb cmd |
| 【xcode】Xcode常用快捷键与技巧 |
| Android开发中的线程池使用 |
| Java 和 Android 的 Base64 |
| Android 测试文字编码格式 |
| 微信小程序支付 |
| 安卓权限记录 |
| 知乎之自动养号 |
| 【Android Jetpack】DataStore |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/29 4:01:20- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |