在前面我们已经了解到如何创建线程,要么就重写Thread类的run方法,要么就实现Runnable接口的run方法,然后调用Thread类的start方法去启动它,可能我们发现了,最终执行的其实还是run方法里面的代码,那么为什么一定要通过start方法来调用呢?我直接调用run方法不就好了吗,正常思维情况下,确实是这样的,但是到底对不对,我们来做个试验;

代码如下:

public static void main(String[] args) {

Runnable runnable = () -> {

System.out.println(Thread.currentThread().getName());

};

runnable.run();

new Thread(runnable).start();

}

我们先创建了一个Runnable对象并实现了它的run方法,然后直接通过对象.run()来调用,

后面的是我们创建了一个Thread类,并将runnable对象传了进去然后调用start方法。

如果按照我们前面设想的一样,那么执行之后控制台应该打印出两个新的线程的名字,但是实际的打印结果是:

main

Thread-0

这与我们预期的不同,直接调用run方法,打印的是主线程的名字,而不是我们设想的那样,是一个新的线程的名字,这是为什么?

这是因为在Java中,代码的执行都是通过主线程来执行的,而run方法其实就是一个普通的Java方法,你直接调用run方法,那么程序就直接执行了,并不会去开启一个新的线程,那为什么start方法就可以开启一个新的线程呢?我们来看看start方法的含义

start方法的含义

我们知道,代码都是通过主线程来一行行的执行的,当代码执行到Thread.start方法这一行时,主线程就发现,咦,这个家伙想要开启一个新的线程,那好的吧,我去通知一下虚拟机(JVM),这里有个家伙想要开启一个新线程了,你有没有空,有空就帮它开启一下吧,然后虚拟机接收到这个请求后,等到空闲时,就满足了它的这个要求。

那这个时候我们就知道了,start这个方法是用来通知虚拟机,我想要开启一个新的线程,这个时候虚拟机在条件允许的情况下,就会满足它的要求。同时我们还需要注意一个点,真正发出通知的是主线程,是它来帮我们发出这个请求的。所以,正确启动线程的方式是调用Thread类的start方法。

重复调用start方法时,会发生什么

我就提前告诉你好了,会抛出一个IllegalThreadStateException的异常,至于是为什么,就需要我们去看看Thread类的源码了,我们进入到Thread类中的start方法后,会发现,在方法的一开始,就会做一个判断:

if (threadStatus != 0)

throw new IllegalThreadStateException();

如果threadStatus != 0 的话就抛出这个异常了,threadStatus又是什么,它代表了一个线程的状态,线程有6个状态,至于是哪6个状态,后续会讲的。在Thread类初始化的时候,threadStatus就已经被赋值为0了,当我们调用了start方法之后,这个状态值就会被修改,所以,当我们重复调用start方法的时候,就会抛出异常了

java 怎么启动线程_线程如何正确的启动相关推荐

  1. java 销毁线程_线程 学习教程(一): Java中终止(销毁)线程的方法

    结束线程有以下三种方法: (1)设置退出标志,使线程正常退出,也就是当run()方法完成后线程终止 (2)使用interrupt()方法中断线程 (3)使用stop方法强行终止线程(不推荐使用,Thr ...

  2. java线程池是如何复用线程_线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)...

    任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...

  3. java executors 详解_线程池—Executors 详解

    各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题 线 ...

  4. java 线程 操作系统线程_线程基础:线程(1)——操作系统和线程原理

    1.概述 我在写"系统间通信技术专栏"的时候,收到很多读者的反馈.其中有一部分读者希望我抽空写一写自己关于对Java线程的使用经验和总结.巧的是,这个月我所在的技术团队也有很多同事 ...

  5. java executors 详解_线程池Executors详解

    为什么要用线程池呢? 一是减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务; 二是可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累 ...

  6. python-生产者消费者模型_线程_线程互斥锁_GIL全局解释器锁

    进程 1. 开启进程的两种方式 2. 进程对象其他属性和方法-pid: 进程id号 os.getpid()-ppid: 父进程id号 os.getppid() -is_alive(): 当前进程是否存 ...

  7. pthread 立即停止线程_线程取消(pthread_cancel)

    基本概念 pthread_cancel调用并不等待线程终止,它只提出请求.线程在取消请求(pthread_cancel)发出后会继续运行, 直到到达某个取消点(CancellationPoint).取 ...

  8. 华硕主板无盘启动bios设置_【华硕主板bios启动顺序】华硕主板bois启动项_华硕主板bios硬盘启动...

    2016-04-25 19:22:29 现在电脑主板都有启动快捷键,用户只需在开机时按下启动热键就可以选择U盘启动,那么华擎主板U盘启动快捷键是什么呢?接下来系统城小编就以华擎ASROCK主板b85m ...

  9. win10设置开机启动项_如何进行win7开机启动项设置

    开机启动项是开机的时候系统会开启的程序.有时电脑开机启动会自动加载很多程序,严重拖慢电脑的开机速度.我们该如何设置开机启动项来取消这些加载的程序呢?下面小编解析如何进行win7开机启动项设置吧. wi ...

  10. nvme固态必须uefi启动吗_为什么 Windows 10 开机启动这么快

    硬件配置高,CPU,内存,固态硬盘,主板等都速度提升了,以及从磁盘分区.镜像选择.系统安装.设置优化.软件设置.垃圾清理,再到系统备份.系统安全.日常使用等都给与了优化. 除了 Windows 10 ...

最新文章

  1. 百度搜索结果URL参数含义解析
  2. MySQL的Redolog/Undolog/binlog日志
  3. Boost:基于Boost的阻塞TCP回显服务器
  4. [html] html和html5有什么区别呢?
  5. 5年之后,产品经理,没了?
  6. mysql 联表删除limit_sql连表删除 | 深蓝的blog
  7. FA_固定资产六大业务增加、修改、报废、在建、折旧、盘点概述(概念)
  8. 包导出Android升级ADT22后会报ClassNotFoundException的原因分析
  9. go编译成linux可执行,Golang 编译Mac、Linux、Windows多平台可执行程序
  10. verilog语法记录(一)
  11. abab的四字成语_abab的四字词语成语
  12. Word文档docx的图标显示异常,doc的显示正常,但是可以用,解决办法
  13. 计算机声卡视频无法安装驱动程序,电脑声卡驱动怎么安装,教你三步搞定声卡驱动...
  14. LeetCode 237. 删除链表中的节点
  15. Ubuntu下载、配置、运行Anaconda
  16. 利用计算机打字教学设计,“第7课 玩打字游戏”教学设计
  17. 一个Java画图板程序的设计
  18. vivox6android版本5.1,vivo X6的手机系统是什么?vivo X6能升级安卓5.0吗?
  19. 电子计算机奏出美妙的交响改为把字句,北师大版三年级下册语文的期中试卷
  20. Android解决部分手机拍照照片自动旋转的问题

热门文章

  1. 007API网关服务Zuul
  2. 一周学会Mootools 1.4中文教程:(4)类型
  3. 2DToolkit官方文档中文版打地鼠教程(一):初始设置
  4. Oracle中 char varchar varchar2的区别
  5. FCKeditor 上传图片和浏览服务器时提示请先登陆的解决办法
  6. C++_类和对象_对象特性_空指针访问成员函数_用法和问题解决---C++语言工作笔记050
  7. ElementUI以及uvie的图标使用和设置---SpringCloud Alibaba_若依微服务框架改造_ElementUI+uniapp_uview---工作笔记015
  8. Sharding-JDBC水平分库(水平数据库分片策略配置)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记010
  9. Linux工作笔记038---CentOS8.2安装Nginx_测试通过
  10. 2015年4月1号 的日志