这一块主要是从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. Django之模板(T)

    一, 常用语法 Django模板中只需要记两种特殊符号: {{ }}和 {% %} {{ }}表示变量,在模板渲染的时候替换成值,{% %}表示逻辑相关的操作. 一, 变量 语法: {{ 变量名 }} ...

  2. React Hooks实现异步请求实例—useReducer、useContext和useEffect代替Redux方案

    本文是学习了2018年新鲜出炉的React Hooks提案之后,针对异步请求数据写的一个案例.注意,本文假设了:1.你已经初步了解hooks的含义了,如果不了解还请移步官方文档.(其实有过翻译的想法, ...

  3. [WPF自定义控件库] 关于ScrollViewer和滚动轮劫持(scroll-wheel-hijack)

    原文:[WPF自定义控件库] 关于ScrollViewer和滚动轮劫持(scroll-wheel-hijack) 1. 什么是滚动轮劫持# 这篇文章介绍一个很简单的继承自ScrollViewer的控件 ...

  4. CentOS7修改为国内yum源

    备份源yum源 如果是国内下载的CentOS很可能国内YUM源已经设置好了. 备份/etc/yum.repos.d/下的*.repo文件. 在CentOS中配置使用网易和阿里的开源镜像 wget ht ...

  5. hadoop HA + HBase HA搭建:

    hadoop HA搭建参考:https://www.cnblogs.com/NGames/p/11083640.html (本节:用不到YARN 所以可以不用考虑部署YARN部分) Hadoop 使用 ...

  6. tailf 跟踪日志文件

    1.命令功能 tailf 跟踪日志文件增长,作用跟tail –f相同.tailf将输出文件的最后10行,然后等待文件增长. 2.语法格式 tailf  option  file 参数说明 参数 参数说 ...

  7. 如何对Web服务器进行飓风级防御

    万一你的网站被DDOS飓风式攻击,你会怎么办?笔者以经验告诉你,这里的每一层都起着保护网站的作用.如果您宁愿拥有如何在单台服务器上维持大量流量的版本,则可以: 专用硬件服务器,无共享主机 千兆上行链路 ...

  8. web框架之初识Django

    目录 一.web框架 1.1什么是web框架 1.2自制的简易web框架 1.3三大主流web框架简介 Django Flask Tornado 1.4动态网页与静态网页 二.初识Django框架 2 ...

  9. win8安装maven

    1.下载并解压maven F:\maven\apache-maven-3.5.2 2. 设置环境变量 3. Path路径中添加maven的可执行文件目录(bin目录) 4.验证maven是否安装成功: ...

  10. POJ 3660 Cow Contest ( 最短路松弛思想应用 && Floyd求传递闭包 )

    题意 : 给出 N 头奶牛在比赛的结果,问你最多的能根据给出结果确定其名次的奶牛头数.结果给出的形式为 A  B 代表在比赛当中 A 战胜了 B 分析 : 对于一头奶牛来说,如果我们能确定其他 N - ...