这一块主要是从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. #python# error:illegal multibyte sequence

    读取html遇到illegal multibyte sequence 1.第一种情况:更换编码方式 查看网页源码,找到charset,得到该网页编码方式 <meta http-equiv=&qu ...

  2. EOJ Monthly 2019.2 A. 回收卫星

    题目传送门 题意: 你可以询问一个三维坐标,机器会告诉你这个坐标在不在目标圆中, 并且(0,0,0)是一定在圆上的,叫你求出圆心坐标 思路: 因为(0,0,0)一定在圆上,所以我们可以把圆心分成3个坐 ...

  3. 问题 J: 老肖数等式

    问题 J: 老肖数等式 时间限制: 1 Sec  内存限制: 128 MB提交: 1594  解决: 741[提交] [状态] [命题人:jsu_admin] 题目描述 老肖前几年当了小学数学老师,他 ...

  4. vue路由定义

    router  根据URL分配到对应的处理程序 单应用页面,vue开发中只有一个一面 例如我们在开发移动端的时候,正常情况下底部的tab有四个选项: 首页     home 发现     find 订 ...

  5. JavaScript基础8——弹窗案例

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. vue v-model 的使用

    Vue的核心特性之一是双向绑定,vue的响应式原理是实现了数据->视图 v-bind只能实现数据的单向绑定 ,从M自动绑定到V 使用v-model 可以实现表单元素的双向绑定,且只能应用到表单元 ...

  7. Java JNA (五)—— 释放Memory对象分配的内存

    Java进程的内存包括Java NonHeap空间.Java Heap空间和Native Heap空间. JNA中的Memory对象是从Native Heap中分配空间.但java的GC是针对Java ...

  8. Maya2017下载安装与激活

    目录 1. 更多推荐 2. 下载地址 2.1. OneDrive 2.2. 百度云 3. 安装激活步骤 1. 更多推荐 其他Maya版本的下载与激活:https://www.cnblogs.com/c ...

  9. 结合pychrom与selenium实现页面自动登录

    缘起 一直在浏览器里用Katalon插件录制一些常用的流程,以减少重复操作,也就自然而然想自己搞搞自动化测试,但无奈登录一关跨不过去,就无法串起来.(不想让开发添加万能验证码的功能)首先想到的是识别验 ...

  10. spring boot 加载指定xml

    方法一:使用@ImportResource 方法二:在test中 @ContextConfiguration(locations = "classpath:spring-profile.xm ...