java学习之创建线程方法二
我们上一节当中讲到了创建线程的第一种方法,就是继承Thread类,覆写Thread当中的run方法,然后创建子类对象,之后调用对象的start方法启动线程。但是这种方法有一个缺陷,因为我们知道在java当中类与类当中是单继承的关系,假如现在我们的子类是另外一个类的子类,这个时候如果这个子类想使用多线程的话,就没有办法了。我们之前说接口的时候,知道接口的存在就是为了扩展类的功能,而避免多继承。那么有没有一种方法可以通过实现接口来完成多线程的创建呢?我们查阅Api可以知道,在java当中为我们提供了一个Runnable接口。在查阅文档的同时,我们知道在Runnable这个接口当中,只有一个run方法。我们只能实现Runnable这个接口中的方法,但是我们知道用在Runnable接口当中只有一个run方法,但是线程的启动需要start()方法,那么这个时候应该怎么办呢?在Thread类中有一个构造函数,他接受一个Runnable类型的参数,然后创建一个线程。在Runnable的run方法当中,也有一个说明是说:需要启动一个线程来调用Runnable当中的run方法。
代码实例(用Runnable来创建线程):
class Demo4 implements Runnable
{ public void run()
{ for(int i = ; i<= ; i++)
System.out.println("Dangqianxiancheng"+Thread.currentThread().getName()+"i is "+i); } } class ThreadDemo4
{ public static void main(String[] args) { Demo4 d = new Demo4();
Thread t1 = new Thread(d);
Thread t2 = new Thread(d);
t1.start();
t2.start(); } }
在这种方法当中我们创建线程的步骤就是:
1、定义一个类然后实现Runnable当中的run方法
2、创建该类实例
3、创建线程对象,并且把上个类的实例当作构造参数传入该线程对象
4、调用线程对象的start()方法,开启线程。
细节:在用这种方式创建线程对象的时候,这里有几个需要注意的地方。第一个就是本身在Thread类当中就有一个run方法,但是我们实现的Runnable接口当中也有一个run方法,这个时候就存在一个问题。就是,当我们调用run方法的时候到底是使用的那一个run方法呢?这个时候就用到了策略模式。其实这个时候,在构造函数的时候,先判定当前的对象是否有传入的参数,如果有传入的参数就调用传入的参数即Runnable接口的run方法,如果没有就调用本身的run方法,在代码上的体现就是:
class Thread()
{ private Runnable r;
Thread(){}
Thread(Runnable r)
{ this.r = r; }
public void run()
{ if(r != null)
r.run(); }
public void start()
{ } }
这个时候就确定应该调用谁的方法了。
Runnable线程的设计思想:
在创建线程的第一种方式当中,要创建线程必须继承Thread类,但是继承Thread类之后,该类也成了Thread类的体系,具备了Thread当中那些自己并不大需要的方法。并且该类一旦继承Thread类之后就成了他的体系了。此时我们把其中的任务分离出来,之后把他封装成接口。这样就能够让其他的类继承这个接口,然后把这个接口传入到Thread的对象当中来调用,这样就避免了java单继承的局限性,也降低了任务与线程之间的耦合性。
Runnable接口的好处:
1、将任务从线程当中抽离出来,进行了封装,把任务封装成了对象。
2、避免了java单继承的局限性。
一般这种创建方法比较常用。
java学习之创建线程方法二的更多相关文章
- java学习之- 创建线程run和start特点
标签(空格分隔): run,start 为什么做run方法的覆盖? 1.Thread类用于描述线程,该类就定义一个功能用于存储线程要运行的代码,该存储功能就是run方法: 也就是说Thread种的ru ...
- Java学习-026-类名或方法名应用之二 -- 统计分析基础
前文讲述了类名或方法的应用之一调试源码,具体请参阅:Java学习-025-类名或方法名应用之一 -- 调试源码 此文主要讲述类名或方法应用之二统计分析,通过在各个方法中插桩(调用桩方法),获取方法的调 ...
- #Java学习之路——基础阶段二(第五篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- java学习笔记14--多线程编程基础1
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note14.html,转载请注明源地址. 多线程编程基础 多进程 一个独立程序的每一次运行称为 ...
- Java并发--如何创建线程
下面是本文的目录大纲: 一.Java中关于应用程序和进程相关的概念 二.Java中如何创建线程 三.Java中如何创建进程 转载原文链接:http://www.cnblogs.com/dolphin0 ...
- 【多线程】创建线程方式二:实现Runnable接口
创建线程方式二:实现Runnable接口 代码示例: /** * @Description 实现Runnable接口,重写run方法,执行线程需要丢入Runnable接口实现类,调用start方法 * ...
- Java中如何创建线程
Java中如何创建线程 两种方式:1)继承Thread类:2)实现Runnable接口. 1.继承Thread类 继承Thread类,重写run方法,在run方法中定义需要执行的任务. class M ...
- Java学习-025-类名或方法名应用之一 -- 调试源码
上文讲述了如何获取类名和方法名,敬请参阅: Java学习-024-获取当前类名或方法名二三文 . 通常在应用开发中,调试或查看是哪个文件中的方法调用了当前文件的此方法,因而在实际的应用中需要获取相应的 ...
随机推荐
- JAVA深入研究——Method的Invoke方法
http://www.cnblogs.com/onlywujun/p/3519037.html 在写代码的时候,发现Method可以调用子类的对象,但子类即使是改写了的Method,方法名一样,去调用 ...
- Office 365 for TechNet 版本国家地区没有中国选项
TechNet订阅用户提供一个Office365的注册,今天想测试一下,结果发现TechNet版本的没有中文地区选项 以下是官网E3使用账号注册,有中国地区 以下为TechNet订阅的office36 ...
- nginx上搭建HLS流媒体服务器
http://blog.csdn.net/cjsafty/article/details/7922849 简介:HTTP Live Streaming(缩写是 HLS)是一个由苹果公司提出的基于HTT ...
- 使windows server 2003 开机不显示登录页面
1.运行“regedit”,以打开“注册表管理器”:运行注册表编辑器,依次展开[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersi ...
- xfire构建webservice项目步骤以及使用
简单搭建xfire开源软件的webservice开发及其步骤: 1.创建好一个web工程,引入xfire下的jar包,注意lib下的和xfire-all.jar 2.定义接口: package com ...
- ubuntu ssh安装
参考 http://www.linuxidc.com/Linux/2010-02/24349.htm 文章很不错!! ssh 登录名@ip地址 , 如果提示验证key can't be esta ...
- 使用WebBrowser的记录
第一:新建一个类,用了获取WebBrowser元素的类 //需要引用 Interop.SHDocVw 和 Microsoft.mshtmlpublic class Element { //根据Name ...
- apache2.2+PHP5.4.28
搭建apache+php开发环境,apache一路正常安装,但是,下载的php搭建后,配置好apache.php,始终报错“The requested operation has failed!”换了 ...
- php提取背景图片
preg_match_all('/background\s*-\s*+image\s*:\s*url\s*\("*([^"]*)"*\)/i', $content,$ma ...
- Python深入学习笔记(一)
写在前面的话 从08年接触Python到现在,断断续续地使用,到如今Python已经成为日常事物处理.科研实验,甚至工程项目的主力语言,主要因为其敏捷性和快速实现的能力.虽然看了一些Python的教程 ...