[size=medium] 接触java也有一段时间了,以前选择java原因就是java很流行,好就业,那是开始学习java只是简单学习,没有更深层的理解how ,why。这也是觉得自己的java技术还是这么菜。现在开始重温下j2se方面的知识,写点笔记记录下
概念
线程,就是你写的一个简单的程序,运行的载体的就是线程,帮你完成一件事。我的简单理解就是,线程就像洗衣机一样,它的功能帮你完成洗衣服,犹豫你很懒堆了一个月的衣服,而此时要洗,肯定是一个洗衣机搞不定了哦,而你要赶时间要把这个一个衣服用最短的时间洗完,你就用多台洗衣机来洗(纯属假设,如果你家是卖洗衣机的到可试试),刚才那情形就是传说的多线程,就是多个任务同时运行,并起运行,就是并发了。
运行
你要用洗衣机洗衣服,前提是你已有脏衣服的存在,放在洗衣机里,然后插上电,打开洗衣开关,洗衣机就开始工作了哦。同样在使用线程时,你要把你要打算做的事要事先编码好,然后把它添加到线程的run()方法中。最后调用start()方法,ok! 跟洗衣机一样工作了。随着高科技和不断创新的发展,洗衣机洗衣方式也是多种多样,我见过两种,一种是很古老的:就是洗衣和脱水时分开的那种,这种用起来很不方便,需要自己脱水(我很讨厌这种洗发)。一种是很先进的:就是洗衣和脱水完美的融为一体,这样很方便了,不要你亲自来脱水(很喜欢这种洗发)。其实实现线程的方式也有两种了。第一种就是很直接的使用Thread类搞定。继承Thread 在run()方法中放入你要实现的功能。如下代码

 public class ThreadDemo extends Thread {

    @Override    public void run() {     System.out.println("hello ! i'm from Thread");   }

}

在run方法中只是一句简单的输出语句。然后运行,代码如下

 public static void main(String [] args){   ThreadDemo demo=new ThreadDemo();                      demo.start();  }

好了第一种线程运行方式搞定,接下来看第二种,就是实现Runnable接口了

public class ThreadDemo2  implements Runnable{

   @Override    public void run() {         System.out.println("hello ! i'm from Runnable");

   }

}

这种方式就是逼着你要实现run()方法了。其执行也略有不同了

public static void main(String [] args){   Thread demo=new Thread(new ThreadDemo2());   demo.start();}

实现Runnable执行需要一个载体了,为什么了?看Runnable的源码

public interface Runnable {    /**     * When an object implementing interface <code>Runnable</code> is used     * to create a thread, starting the thread causes the object's     * <code>run</code> method to be called in that separately executing     * thread.     * <p>     * The general contract of the method <code>run</code> is that it may     * take any action whatsoever.     *      * @see     java.lang.Thread#run()     */    public abstract void run();} 

看起来是不是感觉so easy!它就一个run()方法,就是有装任务的地方,就是没发让功能执行,所以需要求助外援了(纯属简单理解,写的不够严谨)。但为什么要选Thread了,这要看源码了

public  class Thread implements Runnable {............}

看到没,Thread 也实现了Runnable,看来他们有父子之情呀,从面向对象世界来说,子原则上都比父功能更强大丰富(现实中父子谁强谁弱这就无比复杂了,还是面向对象世界单纯)。
所以子要继承父的所有功能,看Thread如何实现,上源码

    /**     * Allocates a new {@code Thread} object. This constructor has the same     * effect as {@linkplain #Thread(ThreadGroup,Runnable,String) Thread}     * {@code (null, target, gname)}, where {@code gname} is a newly generated     * name. Automatically generated names are of the form     * {@code "Thread-"+}<i>n</i>, where <i>n</i> is an integer.     *     * @param  target     *         the object whose {@code run} method is invoked when this thread     *         is started. If {@code null}, this classes {@code run} method does     *         nothing.     */    public Thread(Runnable target) {        init(null, target, "Thread-" + nextThreadNum(), 0);    }

这个构造方法是传入一个Runnable类型参数,然后在传个init方法,init方法就是Thread类的初始化的地方,其中有一条语句很重要

 this.target = target;

就是把传入Runnable 类型参数赋给Thread成员变量target,疑问来了,就是在前面实例化了继承Thread类的对象,它的构造方法就是一个无参的构造函数,在看源码

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

在这个构造方法中给init方法传入的第二个参数是null,也就是target=null,初始化了一个null的target,是不是很疑惑呀。好,在上源码



    /**     * If this thread was constructed using a separate     * <code>Runnable</code> run object, then that     * <code>Runnable</code> object's <code>run</code> method is called;     * otherwise, this method does nothing and returns.     * <p>     * Subclasses of <code>Thread</code> should override this method.     *     * @see     #start()     * @see     #stop()     * @see     #Thread(ThreadGroup, Runnable, String)     */    @Override    public void run() {        if (target != null) {            target.run();        }    }

这是从写了Runnable的run()方法,这里面就一个片段,意思是如果target不为null,也就是说我们传入了一个Runnable对象,然后调用Runnable对象的run()方法,这样是因为我们已在实现Runnable接口的类中以从写了run()方法,如果target为null,意思就是通过new Thread而不传入Runnable对象,然后就会调用继承了Thread类的实现类中的run()方法。

在一个循环中创建线程多次运行可能会产生不同的结果,主要是线程调度机制是非确定性的。
[/size]

重拾java之线程1相关推荐

  1. php byte stringbuffer,重拾java基础(十三):String姐妹StringBuffer、StringBuilder总结

    重拾java基础(十三):String姐妹StringBuffer.StringBuilder总结 一.StringBuffer类概述buffer:缓冲 2. 字符串缓冲区,跟String非常相似,都 ...

  2. 重拾Java Network Programming(一)IO流

    前言 最近在重拾Java网络编程,想要了解一些JAVA语言基本的实现,这里记录一下学习的过程. 阅读之前,你需要知道 网络节点(node):位于网络上的互相连通的设备,通常为计算机,也可以是打印机,网 ...

  3. Java学习之路1——安装JDK1.8||安装idea2022||Java项目创建【重拾Java】

    Java学习之路1--安装JDK1.8||安装idea2022[重拾Java] 前言 安装 安装JDK1.8 安装idea2022(JetBrains Toolbox) Java项目创建 创建 项目结 ...

  4. Java学习之路3——方法定义、调用【重拾Java】

    Java学习之路3--方法定义.调用[重拾Java] 方法定义 为什么要写方法 方法完整的定义形式.调用 方法定义的格式 修饰符 返回值类型 返回值 调用格式 方法重载 方法定义 为什么要写方法 对于 ...

  5. 重拾Java基础知识:设计模式

    设计模式 前言 模式分类 设计原则 单一职责原则 开闭原则 依赖倒置原则 接口分离原则 迪米特法则 里氏替换原则 合成复用原则 创建型模式 工厂模式(简单工厂.工厂方法.抽象工厂) 单例模式 原型模式 ...

  6. 重拾java基础知识总结(超级经典)

    Java基础知识总结(超级经典) 写代码: 1,明确需求.我要做什么? 2,分析思路.我要怎么做?1,2,3. 3,确定步骤.每一个思路部分用到哪些语句,方法,和对象. 4,代码实现.用具体的java ...

  7. 重拾Java基础知识:IO流

    I0流 前言 字节流 InputStream OutputStream 字符流 Reader Writer 缓存流 转换流 序列化流 数据流 字节数组流 打印流 校验流 数据压缩 ZIP压缩和解压 G ...

  8. 【重拾Java系列】—— 八大常用类

    包装类 针对八种基本数据类型相应的引用类型 -- 包装类 包装类和基本数据的转换: (1) jdk5之前采用手动装箱和拆箱的方式 (2) jdk5及以后采用自动装箱和拆箱的方式 (3)自动装箱底层调用 ...

  9. 我的阿里Offer之路(一):不忘初心,重拾Java

    导读 30了,6年PHP月薪没过万,被同龄人尊称为"耿大傻X",之前沉迷于游戏,突然弃坑,学Java,进大厂 正文 2018年11月20日晚20:05,沉迷于<魂斗罗归来&g ...

最新文章

  1. 业余快速学习虚幻引擎教程
  2. springmvc三十:异常处理流程
  3. 使用nginx+tomcat实现动静分离
  4. 岁月在流逝,从阿里退下来接近70后程序猿带给我的启示
  5. K8s入门教程|这个给集群搞硬装的才是幕后英雄
  6. squid配置选项分析
  7. 后台传html样式展示无效_Dcat Admin v1.5.0 发布,对后端开发者高颜值后台系统构建工具...
  8. linux 后台进程管理,Linux 后台进程管理利器 Supervisor
  9. 微信支付基于图计算的反欺诈实践
  10. 详解正向代理与反向代理
  11. (P45)面向对象版表达式计算器:Storage类实现
  12. 网络路由器协议(OSPF、RIP、BGP、IGRP、IS-IS)
  13. cocos2d-x Android游戏黑屏解决办法
  14. 微信小程序 老男孩课程(day1-2.5 到django不会了..要学Pythone)
  15. ITS_Android_S 重构的梳理
  16. PhotoShop CC2015(64位)下载链接和破解教程
  17. 怎么使用大疆无人机建模?
  18. git 远程仓库时报错SSL certificate problem: unable to get local issuer certificate(git版本与Let‘s Encrypt的证书导致)
  19. [Neck] 空间金字塔池化【池化策略】(Space Pyramid Pool, SPP)模块和路径聚合网络【增强】(Path Aggregation Network, PANet)的结构
  20. Java搭建订单状态机模型

热门文章

  1. Arduino - 继电器
  2. 粗同步 符号同步 matlab,OFDM系统在衰落信道中帧同步算法研究(毕业论文)
  3. 底层文件I/O和ANSI标准I/O的区别
  4. java微信多客服_怎么实现微信多公众号管理?有哪些多客服系统?
  5. 动森服务器维护什么时候好,仙境传说RO爱如初见7月1日服务器停机维护
  6. python实现转置矩阵_用Python转置矩阵?
  7. 二次采样设置的四种彩色模式RGB565,ARGB8888,ARGB4444,ALPHA_8
  8. 未能找到类型或命名空间名称“XXXX”(是否缺少 using 指令或程序集引用?)解决
  9. 计算机毕业设计Java河池市旅游信息系统(源码+系统+mysql数据库+lw文档)
  10. 梦行扫码付(收银台条码支付 微信钱包条码支付 支付宝二维码支付 手机APP钱包支付 PHP扫码支付 )