new Thread与线程创建
概要:new Thread 并不意味着已经创建了一个线程,只能说明创建一个类的对象实例而已。而真正创建线程的是start()方法,此方法将调用本地方法start0()创建本地线程,而Thread的run()方法其实是作为一个回调函数被JVM创建的线程所调用。
构造方法与线程创建有关吗,它做了什么?
我们还是来看看源码吧,看Thread的构造方法到底做了什么,各构造重载方法都调用了init方法,而这段代码就是init方法的主要内容:


有上述代码可得,构造方法实现的内容无非就是继承父线程的属性,如是否是后台线程,优先级等,并生成一个线程名称。仅此而已,并没有任何与创建线程有关的操作。
线程是何时创建的?
由注释可知,Start方法将创建一个线程(通过调用本地方法start0),然后JVM会利用新创建的本地线程回调Thread对象的run方法。
JVM如何创建线程及回调run方法,可参考这篇文章:Java创建线程的方法


不调用Thread对象的start()方法,而是直接调用run()方法会如何?
那结果就是没有创建线程,而是在原调用线程执行run方法。
示例代码:
public class ThreadRunTest {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep(3); //延迟打印
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task Completed");
}
};
Thread t = new Thread(runnable);
t.run();
System.out.println("Main Thread print"); //如果t.run()是另外一个线程执行的话,此字符串将先被输出
}
}
程序输出:

此段代码中,run方法执行的线程仍然是Main主线程。与下述代码基本等价:
public class ThreadRunTest {
public static void main(String[] args) {
//begin
try {
TimeUnit.SECONDS.sleep(3); //延迟打印
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Task Completed");
//end
System.out.println("Main Thread print"); //如果t.run()是另外一个线程的话,此字符串将先被输出
}
}
值得一提的是,Runable并没有多么神秘,它不过是一个很普通的接口,有一个run()方法,里面只是要运行的代码块。仅此而已。它的使用方式就是,把要运行的代码块写到run方法里面去,然后找一个线程去执行这个方法,就这样。
new Thread与线程创建的更多相关文章
- java 线程Thread 技术--线程创建源码解释
永远不要忘记最基础的东西,只有把最基础的知识打牢靠,才能够使你走的更远,我将从今天开始,进行线程知识的回顾,一些常用知识点,以及java1.5 引入的并发库,进行详细的讲解与总结 创建线程的目的是为了 ...
- 26_多线程_第26天(Thread、线程创建、线程池)_讲义
今日内容介绍 1.多线程 2.线程池 01进程概念 A:进程概念 a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能 ...
- 17、多线程 (Thread、线程创建、线程池)
进程概念 *A:进程概念 *a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程的概念 *A:线程的概念 *a ...
- 多线程(Thread、线程创建、线程池)
第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程 ...
- java基础(26):Thread、线程创建、线程池
1. 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并 ...
- 记一次tomcat线程创建异常调优:unable to create new native thread
测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...
- Java线程创建形式 Thread构造详解 多线程中篇(五)
Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...
- Java多线程01(Thread类、线程创建、线程池)
Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...
- Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)
这一系列的文章暂不涉及Java多线程开发中的底层原理以及JMM.JVM部分的解析(将另文总结),主要关注实际编码中Java并发编程的核心知识点和应知应会部分. 说在前面,Java并发编程的实质,是线程 ...
随机推荐
- hihocoder#1631 : Cats and Fish
Description There are many homeless cats in PKU campus. They are all happy because the students in t ...
- OC语言-block and delegate
参考博客 OC语言BLOCK和协议 iOS Block iOS Block循环引用精讲 iOS之轻松上手block 深入浅出Block的方方面面 Block apple官方参考 1.定义一个block ...
- Advice from an Old Programmer
You’ve finished this book and have decided to continue with programming. Maybe it will be a career f ...
- [device-orientation] 使用手机设备的方向感应实现图片选择
<div class="main"> <h2>Device Orientation</h2> <table> <tbody&g ...
- unigui的编译部署
unigui的编译部署 unigui既可以EXE形态部署,也可以IIS的ISAPI的形态部署.关键在工程文件.dpr里面的编译开关. {$define UNIGUI_VCL} // 注释此编译开关将使 ...
- 使用更改跟踪(ChangeTracking)来实现数据类型变更
在现实场景中,我们经常会遇到修改数据类型的场景,尤其是自增列从INT修改为BIGINT的情况,自增列又通常作为表的主键和聚集索引键,因此修改操作需要按以下步骤来进行 1. 停止对该表的访问(通过禁用权 ...
- Linux下替代grep高效文本搜索工具
1.ack yum install ack 2.ag git clone https://github.com/ggreer/the_silver_searcher.git yum install a ...
- 那些好用的阅读软件(Windows & Android)
此文章已添加预览与更新,请您移步到我的新博客 http://t.cn/EXCiCTE 整个2018年就没写过几篇博文,所以写一篇文章算过年啦-哈哈-有部分软件因为年代原因,官网已经消失.或者网络上的资 ...
- 反向读取Mysql数据库表结构到PowerDesigner中
使用PowerDesigner挺长时间了,只是一些简单的表结构设计,因需要对当前数据库进行再设计,需要看一下数据库中所有的表,及表之间的关系,并重新修改表结构,因此需求就是怎么把数据库中的表结构反向生 ...
- Selenium3 + Python3自动化测试系列五——常用断言Assertion
断言Assertion 验证应用程序的状态是否同所期望的一致. 常见的断言包括:验证页面内容,如标题是否为X或当前位置是否正确,或是验证该复选框是否被勾选. selenium 提供了三种模式的断言:a ...