前面写过一篇基础的创建多线程的博文

那么本篇博文主要来对照一下这两种创建线程的差别。

继承Thread类:

还拿上篇博客的样例来说:

四个线程各自卖各自的票,说明四个线程之间没有共享,是独立的线程。每一个线程平等。没有优先级关系。

这三个线程不是一次交替运行,而是三个线程同一时候被运行的情况下,有的线程被分配时间片的机会多。票被提前卖完,有的线程被分配的时间片的机会少。票迟一些卖完。

故,利用扩展Thread类创建的多个线程,尽管运行的是同样的代码,但彼此相互独立,且各自拥有自己的资源。互不干扰。

分析Thread类的源代码:

1)Thread类也是实现Runnable接口的。因此实现了Runnable接口中的run方法

2)当生成一个线程对象时,假设没有为其设定名字,那么线程对象的名字将使用例如以下形式:Thread-number,该number将是自己主动添加的。并被全部的Thread对象所共享(由于它是static的成员变量)

3)我们须要重写run方法,由于此时run方法什么事情也不做。

4)当使用Runnable方式生成线程对象时,我们须要实现Runnable接口的run方法,使用new
Thread(new MyThread())来生成线程对象。这时的线程对象的run方法调用MyThread类的run方法,这样我们自己编写的run方法就运行了。

实现Runnable接口:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl1dGVuZ3RlbmcxMzA=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

通过实现Runnable接口来实现线程间资源共享。

继承Thread类与实现Runnable接口的差别:

採用继承Thread类实现多线程:

优势:编写简单,假设须要訪问当前线程。仅仅须要使用this就可以。无需使用Thread.currentThread()方法。

劣势:由于这样的线程类已经继承了Thread类,所以不能再继承其它类。

实现Runnable接口:

优势:线程仅仅是实现了接口,还能够继承其它类。

这样的情况下,能够使多个线程共享一个target对象,所以很适合多个线程用来处理同一份资源的情况,从而能够将cpu、代码和数据分开,形成清晰的模型,较好的体现面向对象思想。

劣势:编程略微复杂。假设须要訪问当前线程,必须使用Thread.currentThread()方法。

实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这样的方式不仅有利于程序的健壮性。使代码可以被多个线程共享。并且代码和数据资源相对独立。从而特别适合多个具有同样代码的线程去处理同一资源的情况。这样一来。线程、代码和数据资源三者有效分离,非常好地体现了面向对象程序设计思想。因此差点儿全部的多线程程序都是通过实现Runnable接口的方式来完毕的。

多线程编程(三)--创建线程之Thread VS Runnable的更多相关文章

  1. 三、多线程之Thread与Runnable的区别

    Thread与Runnable的区别(用三个窗口同时出售10张车票为例子) 运行代码 运行结果 分析 System.out.println("开始测试多线程");class MyT ...

  2. Java多线程之Thread、Runnable、Callable及线程池

    一.多线程 线程是指进程中的一个执行流程,一个进程中可以有多个线程.如java.exe进程中可以运行很多线程.进程是运行中的程序,是内存等资源的集合,线程是属于某个进程的,进程中的多个线程共享进程中的 ...

  3. 慕课网_细说多线程之Thread VS Runnable

    第1章 课前准备 1-1 前言 (00:49) 第2章 Thread VS Runnable 2-1 回顾线程创建的两种方式 (02:33) 继承Thread类 class MyThread exte ...

  4. 实现多线程的三种方法:Thread、Runnable和Callable

    继承Thread类,重写run()方法 步骤: (1) 定义类继承Thread类 (2) 复写Thread类中的run方法. (3) 调用线程的start方法 (start方法有两种含义:1. 启动多 ...

  5. 细说多线程之Thread与Runnable

    1:创建线程的两种方式: 继承Thread类 public class MyThread extends Thread { @Override public void run() { } } MyTh ...

  6. 细说多线程之Thread VS Runnable

    [线程创建的两种方式] [线程的生命周期] ● 就绪:创建了线程对象后,调用了线程的start(). (注意:此时线程只是进入了线程队列,等待获取CPU服务,具备了运行的条件,但并不一定已经开始运行了 ...

  7. 多线程之thread和runnable

    Runnanle方式可以避免Thread由于单继承特性带来的缺陷. Runnable代码可以被多个线程(thread实例)共享,适用于多个线程处理同一资源的情况. 线程的生命周期:创建,就绪,阻塞,运 ...

  8. Android线程之Thread 、Runnable 的两个例子

    Thread例子: package fy.test; import android.app.Activity; import android.os.Bundle; import android.os. ...

  9. Java基础-进程与线程之Thread类详解

    Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...

随机推荐

  1. chrome更改缓存位置

      更改chrome浏览器缓存位置 CreateTime--2017年7月20日08:33:14Author:Marydon 一.参考链接 http://jingyan.baidu.com/artic ...

  2. ADexplorer - 用来查看AD的工具

    ADExplorer是一款可以帮助查看和编辑数据库的软件.该数据库查看编辑器使用方便,操作简单,用户可通过该软件进行浏览AD数据库.自定义快速入口.查看对象属性.编辑权限.精确搜索等操作,还可以保存数 ...

  3. cxf 生成客户端代码调用服务

    cxf是另一种发布webservice的方式,与jdk提供的相比 jdk提供的是wsimport cxf 提供的是 wsdl2java- d 地址 根据http://www.cnblogs.com/f ...

  4. [bug]未能从程序集“System.ServiceModel, Version=3.0.0.0问题解决

    在Windows Server 2008中的IIS服务器中部署WCF服务程序时,通过浏览器访问报出如下错误: 未能从程序集“System.ServiceModel, Version=3.0.0.0, ...

  5. HTTP长连接?短连接?长轮询?短轮询?

    错觉与突然的察觉 大多数人都知道HTTP1.0不支持长连接,知道HTTP1.1支持长连接. 这是业界的一个常识. 然而这样的描述导致了一些不做网络底层开发的开发者都下意识的认为HTTP1.1是一个可以 ...

  6. Object-C中的数字对象

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { ...

  7. 字符串函数---itoa()函数具体解释及实现

    itoa()函数 itoa():char *itoa( int value, char *string,int radix); 原型说明: value:欲转换的数据. string:目标字符串的地址. ...

  8. Linux strace命令使用详解

    strace是Linux环境下的一款程序调试工具,用来监察一个应用程序所使用的系统调用及它所接收的系统信息. 可谓是 linux 下的调试利器,不仅可以用来找程序错误,系统为什么挂死了,命令为什么报错 ...

  9. :-1: error: [debug/moc_gotocelldialog.cpp] Error 2

    环境:Qt5.3 问题描述: 我将一个已经做好可以运行的小程序拷贝了一下,放在另一个目录下打开,却无法运行,提示上面的错误,而且原程序也无法运行了.不知道为什么,还没有答案...

  10. pyqt加载图片

    使用QPixmap可以加载图片,但是图片只能是标准二进制文件格式: bmp,gif,ico,jpeg,jpg,mng,pbm,pgm,png,ppm,svg,svgz,tga,tif,tiff,xbm ...