java多线程--启动线程
简单理解启动线程的几种方式:
1. 实现Runnable接口创建一个任务, 调用myTask.run()方法来启动它


2, 构建Thread对象, 调用thread.start()方法启动
这里可以看到, 我们给Thread构造器传入了runable对象

细心的小伙伴看到这里可能会有疑惑, 我们知道Thread同样有run方法, 这里为什么要调用thread.start()而不是thread.run()呢 ?

这里的target就是我们传进去的runable对象,所以thread的run方法里也是执行了runable的run方法
再看下start方法, 我这里看到的是android-30的源码,可以看到Android在这里做了一些修改
注释里这段英文的意思是说:
调用该方法来启动一个线程时, java VM会去call run方法
调用该方法后会有两个线程同时运行(主线程执行完 start()后返回,调用run方法后子线程也开始执行)
多次启动一个线程是非法的
特别是, 如果一个线程被执行完成, 它将不能再被启动


所以, 回答上面那个问题, 为什么调用start来启动线程而不是直接调用run呢?
因为start方法中 1), 会判断当前线程的状态,如果已经被启动, 则会抛出 IllegalThreadStateException
2), 会将该线程加到 一个group里, 这个group可能包含了当前线程的多个实例。加到这里有什么好处呢?。。。。,,等我知道了再来写
3, 通过Executor来管理线程
CachedThreadPool

FixedThreadPool创建固定数量的线程池

SingleThreadExecutor

这里我们创建了3个线程(id分别为0,1,2),并使用singleThreadExecutor来启动它, 看下运行结果

我们看到: 1), 线程是严格按照我们期望的顺序去启动的(0--> 1 --> 2)。 我们知道在多线程中, 线程间的调度是由线程调度器来完成的, 调度过程可以说是不确定的, 但是SingleThreadExecutor会按照线程被提交的顺序去执行。所以我们说SingleThreadExecutor会序列化所有提交给它的任务,并且维护它自己的悬挂任务队列。
2), 第一个线程执行完成之后才去执行下一个
因此,如果我们有几个线程需要访问同一个系统资源时, 使用这种方式可以确保在任何时刻都只有唯一的线程在操作数据, 从而实现同步,而且线程执行的顺序还是可控的。
4, 通过Callable接口创建线程
在上文中, 我们尝试了通过实现Runnable接口来创建线程。 但是它并不会返回任何值。
那么如果我们希望在任务完成时有返回值, 就可以实现Callable接口。 实现callable接口需要重写call方法, call方法的返回值就是该任务的返回
需要特别注意的是, 我们必须使用ExecutorService.submit()方法来启动它


看下运行结果:

5, 继承Thread类创建线程


小结--创建/启动线程的方式:
1)让我们的task实现runnable接口, 重写run方法, 使用mytask.run()启动
2)让我们的task实现runnable接口,重写run方法, 使用ExecutorService.execute(runnable)方式启动。 常用的ExecutorService有 CachedThreadPool, FixedThreadPool 和 SingleThreadExecutor
3)在Thread的构造方法中传入runnable对象, 使用thread.start()方式启动 (start方法本质上还是去调用了run方法, 但是在调用之前多了一些检查的工作)
4)让我们的task继承自Thread, 重写run()方法, 使用thread.start()方式启动
5)让我们的task实现Callable接口, 使用ExecutorService.submit()方式启动。 该方法可以在任务执行完后给我们返回值
其中1,2,3可以归为同类, 因为都是实现了runnable接口
java多线程--启动线程的更多相关文章
- java——多线程—启动线程
继承Thread启动线程 package com.mycom.继承Thread启动线程; /** * * 继承Thread类启动线程的步骤 * 1.定义自定义线程类并继承Thread * 2.重写ru ...
- Java多线程之线程的启动
Java多线程之线程的启动 一.前言 启动线程的方法有如下两种. 利用Thread 类的子类的实例启动线程 利用Runnable 接口的实现类的实例启动线程 最后再介绍下java.util.concu ...
- Java多线程之线程其他类
Java多线程之线程其他类 实际编码中除了前面讲到的常用的类之外,还有几个其他类也有可能用得到,这里来统一整理一下: 1,Callable接口和Future接口 JDK1.5以后提供了上面这2个接口, ...
- Java多线程之线程的同步
Java多线程之线程的同步 实际开发中我们也经常提到说线程安全问题,那么什么是线程安全问题呢? 线程不安全就是说在多线程编程中出现了错误情况,由于系统的线程调度具有一定的随机性,当使用多个线程来访问同 ...
- Java多线程之线程的控制
Java多线程之线程的控制 线程中的7 种非常重要的状态: 初始New.可运行Runnable.运行Running.阻塞Blocked.锁池lock_pool.等待队列wait_pool.结束Dea ...
- Java多线程02(线程安全、线程同步、等待唤醒机制)
Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...
- java多线程与线程间通信
转自(http://blog.csdn.net/jerrying0203/article/details/45563947) 本文学习并总结java多线程与线程间通信的原理和方法,内容涉及java线程 ...
- Java多线程之线程的生命周期
Java多线程之线程的生命周期 一.前言 当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态.在线程的生命周期中,它要经过新建(New).就绪(Runnable).运行(R ...
- Java多线程| 01 | 线程概述
Java多线程| 01 | 线程概述 线程相关概念 进程与线程 进程:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是操作系统进行资源分配与调度的基本单位.可以把进程简单的理解 ...
随机推荐
- 对抗生成网络GAN
该方法常用于: 图像生成 图像修复,训练用了MSE+Global+Local数据,其中Global+Local判别式用于全局+局部一致性. 图像超分辨率重构 GAN的基本原理,主要包含两个网络 ...
- CentOS 7.3安装Zabbix3.2
一.ZABBIX概述 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件.可以监视各种系统与设备的参数,保障服务器及设备的安全运营. Zabbix的功能和特性: 1.安装与配置简单: ...
- 如何实现LRU缓存?
面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...
- Docker容器管理——运行容器命令
1.容器的生命周期(***重要,需要理解) 容器启动后,执行的第一条命令的PID为1 ========================>>>>>>>& ...
- C# ASP.NET RAZOR 链接SQLSERVER
@using System.Data.SqlClient; @using System.Data;//必须引用 <html> <body> <h1>Learn Sq ...
- 前后端数据交互(八)——请求方法 GET 和 POST 区别
WEB 开发同学一看 get 和 post 请求方法的区别,第一感觉都是 So easy! 学习ajax.fetch.axios时,发送网络请求携带参数时,都需要分别处理get和post的参数.所以我 ...
- 记录centos下nl与cat -n的不同
nl命令列出文件行不包含空格,cat -n包含空格 [root@bogon ~]# cat -n test.txt 1 a 2 aa 3 aaa 4 aaaa 5 aaaaa 6 7 aaaaaa [ ...
- Vue3.x全家桶+vite+TS-搭建Vue3.x项目
目录 一.搭建基础项目 1.vite创建项目 3.运行项目 2.环境变量设置介绍 vite配置多环境打包 二.配置Router 1.安装路由 2.配置路由 3.引入 三.配置Vuex 1.安装vuex ...
- 猪齿鱼 SaaS 版效能平台发布
日前,猪齿鱼Choerodon全场景效能平台Saas版发布,提供体系化方法论和协作.测试.DevOps及容器工具,帮助企业拉通需求.设计.开发.部署.测试和运营流程,一站式提高管理效率和质量.从团队 ...
- discuz连接微博登陆,第三方登录
首先记一下discuz的ucenter的架构: ucenter 是用户中心.其他的应用都是和ucenter连接,包括discuz也是ucenter的一个应用(默认的); 第一步: 在ucenter新建 ...