概要: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与线程创建的更多相关文章

  1. java 线程Thread 技术--线程创建源码解释

    永远不要忘记最基础的东西,只有把最基础的知识打牢靠,才能够使你走的更远,我将从今天开始,进行线程知识的回顾,一些常用知识点,以及java1.5 引入的并发库,进行详细的讲解与总结 创建线程的目的是为了 ...

  2. 26_多线程_第26天(Thread、线程创建、线程池)_讲义

    今日内容介绍 1.多线程 2.线程池 01进程概念 A:进程概念 a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能 ...

  3. 17、多线程 (Thread、线程创建、线程池)

    进程概念 *A:进程概念 *a:进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行, 即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能. 线程的概念 *A:线程的概念 *a ...

  4. 多线程(Thread、线程创建、线程池)

      第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程 ...

  5. java基础(26):Thread、线程创建、线程池

    1. 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并 ...

  6. 记一次tomcat线程创建异常调优:unable to create new native thread

    测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...

  7. Java线程创建形式 Thread构造详解 多线程中篇(五)

    Thread作为线程的抽象,Thread的实例用于描述线程,对线程的操纵,就是对Thread实例对象的管理与控制. 创建一个线程这个问题,也就转换为如何构造一个正确的Thread对象. 构造方法列表 ...

  8. Java多线程01(Thread类、线程创建、线程池)

    Java多线程(Thread类.线程创建.线程池) 第一章 多线程 1.1 多线程介绍 1.1.1 基本概念 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于 ...

  9. Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)

    这一系列的文章暂不涉及Java多线程开发中的底层原理以及JMM.JVM部分的解析(将另文总结),主要关注实际编码中Java并发编程的核心知识点和应知应会部分. 说在前面,Java并发编程的实质,是线程 ...

随机推荐

  1. ES基本操作

    倒排索引 ElasticSearch使用一种称为倒排索引的结构,它适用于快速的全文搜索.一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文档列表. 查询 # 查看索引配置GE ...

  2. NLTK之WordNet 接口【转】

    转自:http://www.cnblogs.com/kaituorensheng/p/3149095.html   WordNet是面向语义的英语词典,类似于传统字典.它是NLTK语料库的一部分,可以 ...

  3. Jquery学习(表单-Button)-----jQuery1.4.2

    <html> <head> <base href="<%=basePath%>"> <title>My JSP 'jqu ...

  4. Linux 下建立 SSH 隧道做 Socket 代理

    背景 需要解决本地访问内部集群中各台机器上的内部web服务,但是内部集群不能直接访问,只能通过edge node节点跳转. 前提:edge node可以通过ssh方式访问,在edge node上可以访 ...

  5. UWP 取消GridView、ListView鼠标选中、悬停效果

    因为经常碰到ListView或者ListBox之类的选中.鼠标悬停样式和自己设置的主题颜色不搭,这时就需要改变这些样式了. 而这里我通过ListView来说明,大致思路其实就是重新定义Item的Tem ...

  6. TextBox Ctrl+A不能全选的问题

    问题: 当TextBox控件在设置了MultiLine=True之后,Ctrl+A 无法全选,十分影响使用体验. 对于这个问题不明所以,不知道是Bug,还是故意而为之... 解决1: 添加KeyDow ...

  7. 浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入

    在<浏览器环境下JavaScript脚本加载与执行探析之defer与async特性>中,我们研究了延迟脚本(defer)和异步脚本(async)的执行时机.浏览器支持情况.浏览器bug以及 ...

  8. 【npm】详解npm的模块安装机制

      依赖树表面的逻辑结构与依赖树真实的物理结构 依赖树表面的逻辑结构与依赖树真实的物理结构并不一定相同! 这里要先提到两个命令:tree -d(linux)和npm ls(npm) 在一个npm项目下 ...

  9. 100道Java基础面试题

    1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Client/Server),客户端/服务端,桌面应用程序 2.你所知道网络协议有那些? H ...

  10. 跟着刚哥学习Spring框架--JDBC(六)

    Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简 ...