Java thread(2)
这一块主要是从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)的更多相关文章
- Java Thread 的 sleep() 和 wait() 的区别
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 1. sleep ...
- Java Thread 的 run() 与 start() 的区别
Java Thread 的使用 Java Thread 的 run() 与 start() 的区别 Java Thread 的 sleep() 和 wait() 的区别 1. ...
- Java Thread wait, notify and notifyAll Example
Java Thread wait, notify and notifyAll Example Java线程中的使用的wait,notify和nitifyAll方法示例. The Object clas ...
- java: Thread 和 runnable线程类
java: Thread 和 runnable线程类 Java有2种实现线程的方法:Thread类,Runnable接口.(其实Thread本身就是Runnable的子类) Thread类,默认有ru ...
- Java Thread join() 的用法
Java Thread中, join() 方法主要是让调用改方法的thread完成run方法里面的东西后, 在执行join()方法后面的代码.示例: class ThreadTesterA imple ...
- Java thread jargon
In Java thread topic, the task to be executed and the thread to drive the task are two concepts shou ...
- 性能分析之-- JAVA Thread Dump 分析综述
性能分析之-- JAVA Thread Dump 分析综述 一.Thread Dump介绍 1.1什么是Thread Dump? Thread Dump是非常有用的诊断Java应用问题的工 ...
- Java Thread线程控制
一.线程和进程 进程是处于运行中的程序,具有一定的独立能力,进程是系统进行资源分配和调度的一个独立单位. 进程特征: A.独立性:进程是系统中独立存在的实体,可以拥有自己独立的资源,每个进程都拥有自己 ...
- [译]Java Thread wait, notify和notifyAll示例
Java Thread wait, notify和notifyAll示例 Java上的Object类定义了三个final方法用于不同线程间关于某资源上的锁状态交互,这三个方法是:wait(), not ...
- [译]Java Thread Sleep示例
Java Thread Sleep示例 java.lang.Thread sleep(long millis)方法被用来暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒.注意参数不能为负数,否则 ...
随机推荐
- Spring事务管理之几种方式实现事务(转)
一:事务认识 大家所了解的事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销.Spring事务管理基于底层数据库本身的事务处理机制.数据库事务的基础,是掌握Spring ...
- jmeter 线程数—请求数详解
一个性能测试请求负载是基于一个线程组完成的.一个测试计划必须有一个线程组.测试计划添加线程组非常简单.在测试计划右键弹出下拉菜单(添加-->Threads(Users)--->线程组)中选 ...
- 在vsCode中用git命令合并分支
提交修改代码到本地仓库 $ git commit -m "修改的东西的描述"切换到master主分支上 $ git checkout master拉取主分支上面的代码 $ git ...
- linux基础开发软件安装 - java相关
1.linux在线安装mysql:转自 https://www.cnblogs.com/bigbrotherer/p/7241845.html ,写的很好,简单易用. 开启远程访问:转 https:/ ...
- 前端开发HTML&css入门——盒子模型以及部分CSS样式
CSS处理网页时,它认为每个元素都包含在一个不可见的盒子里.• 为什么要想象成盒子呢?因为如果把所有的元素都想象成盒子,那么我们对网页的布局就相当于是摆放盒子.• 我们只需要将相应的盒子摆放到网页中相 ...
- Vue Cli3 TypeScript 搭建工程
Vue Cli3出来也一段时间了,我想尝试下Vue结合TypeScript搭建个工程,感受下Vue下用TS...网上有一篇讲的非常详细的教程 vue-cli3.0 搭建项目模版教程(ts+vuex+ ...
- 线程屏障CyclicBarrier实现原理
生产环境中,存在需要等待多个线程都达到某种状态后,才继续运行的情景.并发工具CyclicBarrier就能够完成这种功能.本篇从源码方面,简要分析CyclicBarrier的实现原理. 使用示例 pu ...
- 使用Jmeter聚合报告生成对比图表
背景 最近在帮别的项目组执行性能测试,使用的工具是Jmeter.接口录制和参数化前一个人已经做好了,我主要的工作就是执行脚本,撰写测试报告.事情并不复杂,可做起来却极为耗时. 首先,由于有6组账号,分 ...
- MySQL concat函数里面单引号的使用
通过concat拼字符串的时候,如果语句里面需要使用单引号,可以使用两个单引号来代替一个引号
- django 使用ORM插入数据,提示Cannot assign "1": "B" must be a "Projectconfig" instance.
这是因为使用了外键导致的, 如果使用了外键,先实例化外键查询,然后再插入的表里面放入实例化后的外键连接