这一块主要是从Thread类源码的角度来分析两种线程的实现方式,这里分析的也仅仅是最基本的部分。

就从线程的启动函数 start方法开始分析 只是分析最主要的部分

在start()方法中,除了group的相关操作(这个后面再分析),最核心的部分就是执行了start0方法这个start0方法是native方法,表示这里需要与操作系统进行交互,具体的还没有深入研究,貌似是申请一些资源,启动一个新的线程,并且在新的线程中会对run()方法进行调用。所以我们用到的start方法说白了就是以一个线程的方式来调用run方法。

接下来再分析run()方法,这个要分两种情况来讨论了。

1、 通过继承Thread类,重写run方法来生成一个线程的情况下,我们甚至都不用看thread中run方法的源码了,因为这个方法反正都是要被重写的,只要将其中的内容换成我们自己的内容就行。要是继承了Thread但没有重写run方法会怎样?那么这个线程什么都不会做。

2、 为何什么都不会做?在第二种情况下,我们会通过实现一个Runnable接口然后将这个Runnable接口作为形参来初始化一个线程,我们具体来看run函数的源码:

public void run() {

if (target != null) {

target.run();

}

}

这个很容易理解,如果target不为空的时候就执行target的run方法,如果target为空的时候就什么都不执行,构造函数为Thread(Runnable target),容易猜到,target实际就是一个Runnable接口。

这个是target的定义部分private Runnable target;

我们再看传入runnable接口生成线程对象所用到的构造方法:

public Thread(Runnable target) {

init(null, target, "Thread-" + nextThreadNum(), 0);

}

这个方法主要是执行了init函数,具体的init函数的声明如下:

private void init(ThreadGroup g, Runnable target, String name,long stackSize)

只要看到其中的这句就ok了:this.target = target;

将参数中传进来的Runnable接口赋值给本Thread类的target属性。那个String name是传递进来的线程的名称,默认是 Thread- +number的形式。

这样以来我们回头看run方法也就很清楚了,采用这种方式的时候,run方法实际上执行的是我们传入的Runnnable接口中的run方法,也就是线程主要执行的任务。

采用第一种方法的时候,构造函数为

public Thread() {

init(null, null, "Thread-" + nextThreadNum(), 0);

}

此时原本的Thread类中的target为null,要是我们不重写run方法的话,就会什么都不执行,有了上面的分析,对于两种方式的线程时间的原理,应该就比较清晰了。

两种方式的比较:

1 两种方法均需要执行start方法 为线程分配系统资源并执行run方法

2 用哪种方式实现,要视具体情况而定,当一个线程已经继承了另一个类的时候(java中仅允许单继承)就要用实现一个Runnable接口的方式来生成线程。(多继承可能会引起语义的不明确 比如两个父类都有同名的方法 子类不知道调用的是哪个父类当中的 但是继承多个接口(接口 不是抽象类)的时候 由于方法只有在子类中的一种实现形式 因此不会引起语义的混乱)

3 线程的消亡不能通过使用stop方法来结束(使用stop方法是不安全的),只能等run方法运行完线程才会自动结束。

4 因为线程一旦运行起来,通常就不收控制了,用stop方法停止一个线程是不安全的方法,一般情况下不要使用,于是通常停止线程的方法是通过while循环,将run方法放在while循环中,一旦符合了某个条件,就通过break跳出循环,结束线程。

Java thread(2)的更多相关文章

  1. Java Thread 的 sleep() 和 wait() 的区别

    Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别       1. sleep ...

  2. Java Thread 的 run() 与 start() 的区别

    Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别             1. ...

  3. Java Thread wait, notify and notifyAll Example

    Java Thread wait, notify and notifyAll Example Java线程中的使用的wait,notify和nitifyAll方法示例. The Object clas ...

  4. java: Thread 和 runnable线程类

    java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...

  5. Java Thread join() 的用法

    Java Thread中, join() 方法主要是让调用改方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码.示例: class ThreadTesterA imple ...

  6. Java thread jargon

    In Java thread topic, the task to be executed and the thread to drive the task are two concepts shou ...

  7. 性能分析之-- JAVA Thread Dump 分析综述

    性能分析之-- JAVA Thread Dump 分析综述       一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...

  8. Java Thread线程控制

    一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...

  9. [译]Java Thread wait, notify和notifyAll示例

    Java Thread wait, notify和notifyAll示例 Java上的Object类定义了三个final方法用于不同线程间关于某资源上的锁状态交互,这三个方法是:wait(), not ...

  10. [译]Java Thread Sleep示例

    Java Thread Sleep示例 java.lang.Thread sleep(long millis)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...

随机推荐

  1. Appium+Python之批量执行测试用例

    思考:当存在多个脚本,每个脚本中有多条测试用例时,我们该如何批量执行呢?分析:首先创建2个测试用例脚本(.py文件),每个脚本有2条测试用例,然后批量执行全部测试用例 #Test_01.py # co ...

  2. shutdown的几种方法和利弊

    1.shutdown normal      正常方式关闭数据库. 2.shutdown immediate      立即方式关闭数据库.      在SVRMGRL中执行shutdown imme ...

  3. 字典树(Trie树)实现与应用(转)

    一.概述 1.基本概念 字典树,又称为单词查找树,Tire数,是一种树形结构,它是一种哈希树的变种. 2.基本性质 根节点不包含字符,除根节点外的每一个子节点都包含一个字符 从根节点到某一节点.路径上 ...

  4. MATLAB:非线性规划fmincon

    1.非线性规划的形式: 其中x是一个列向量,st中前两项为线性约束条件,后两项为非线性约束条件. 在MATLAB中fmincon是用于求解非线性多远函数的最小值的函数,这里介绍fmincon的其中一种 ...

  5. BUUCTF--rsa

    测试文件:https://buuoj.cn/files/ed10ec009d5aab0050022aee131a7293/41c4e672-98c5-43e5-adf4-49d75db307e4.zi ...

  6. 查看Json的结构及内容:JsonViewerPackage

    下载链接:http://jsonviewer.codeplex.com/ 安装的过程简单,这里就不一一叙述. 找到JsonViewer 打开之后 点击Viewer 旁边的Text 放入你的Json 测 ...

  7. git submodule删除多余模块

    rm -rf 子模块目录 删除子模块目录及源码 vi .gitmodules 删除项目目录下.gitmodules文件中子模块相关条目 vi .git/config 删除配置项中子模块相关条目 rm ...

  8. eclipse没有Web项目和Server选项

    (1)在Eclipse中菜单help选项中选择install new software选项 (2)在work with 栏中输入 http://download.eclipse.org/release ...

  9. idea 配置自动编译 livereload

    1 pom中添加 spring-boot-devtools 依赖 <dependency> <groupId>org.springframework.boot</grou ...

  10. vue 概念与使用vue-cli脚手架快速构建项目

    vue 定义:是一套构建用户界面的渐进式框架,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,它不仅易于上手,还便于与第三方库或既有项目整合. 数据渲染机制: 核心: 响应式数据绑定 ...