题目

阐述创建线程最常用的两种方法及其对比。

解答

方法一:继承Thread类实现

步骤:

  1. 创建Thread类的子类,如MyThread。
  2. 重写Thread类的run()方法。
  3. 实例化MyThread类,对象名如myThread。
  4. 运用Thread类的start()方法启动线程,如myThread.start()。

方法二:实现Runnable接口

步骤:

  1. 创建一个类,如MyRunnableThread,实现Runnable接口。
  2. 创建MyRunnableThread类的对象。
  3. 实例化Thread类,对象名如thread,并向其构造函数传入MyRunnableThread类和线程名两个参数。
  4. 运用Thread类的start()方法启动线程,如thread.start()。

继承Thread类创建线程与实现Runnable接口创建线程的不同之处在于,当用同一个类创建多个线程的时候,前者实际上是创建了多个不同的Thread对象,它内部的run()方法执行的时候是在各自对象中执行,互不干扰,如同多个线程执行多个任务;而后者实际上是使用同一个对象来创建多个线程,所以对象内的属性会公用,那就相当于多个线程在执行同一个任务一样。

另外,在使用上,继承了Thread类的类就不能继承其它类了,而实现了Runnable接口的类,还可以继承其他类,前者相对局限。

这样子说法可能有点抽象,下面那用代码讲解一下。

参考代码

MyThread类

package me.huangzijian;

public class MyThread extends Thread {

    private int num = 10;
private String name; public MyThread(String name) {
this.name = name;
} @Override
public void run() {
int count = num;
for (int i = 0; i < count; i++) {
System.out.println(this.name + ":" + num);
num--;
}
}
}

MyRunnable类

package me.huangzijian;

public class MyRunnableThread implements Runnable {

    private int num = 10;

    @Override
public void run() {
int count = num;
for (int i = 0; i < count; i++) {
System.out.println(Thread.currentThread().getName() + ":" + num);
num--;
}
}
}

TheadCreation类

package me.huangzijian;

public class ThreadCreation {

    public static void main(String[] args) {
// 继承Thread类实现
MyThread myThread1 = new MyThread("MyThread1");
MyThread myThread2 = new MyThread("MyThread2");
MyThread myThread3 = new MyThread("MyThread3");
myThread1.start();
myThread2.start();
myThread3.start(); // 实现Runnable接口
MyRunnableThread myRunnableThread = new MyRunnableThread();
Thread t1 = new Thread(myRunnableThread, "MyRunnableThread1");
Thread t2 = new Thread(myRunnableThread, "MyRunnableThread2");
Thread t3 = new Thread(myRunnableThread, "MyRunnableThread3");
t1.start();
t2.start();
t3.start();
}
}

运行结果:

运行ThreadCreation后,我们会看到,继承Thread类实现的结果如下:

可以看到,三个线程对于字段num的操作是各操作各的,都将num从10减到1。

而实现Runnable接口的就诶过如下:

可以看到,三个线程对同一个myRunnableThread对象的num进行共同的操作。根据程序,每个线程循环10次,所以num从10一直减到负数。有朋友可能会问,为什么一开始三个线程都会获取到10,这就是线程同步的问题了,需要用到synchronized等关键字进行修饰。

每天一道Java题[10]的更多相关文章

  1. 每天一道Java题[11]

    题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synch ...

  2. 每天一道Java题[3]

    问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...

  3. 每天一道Java题[4]

    问题 怎么将字符串转换为int? 解答 此题看似简单,但经常出现在笔试等地方,由于大家习惯了用IDE,有什么还真未必能写出来.通常都是parseInt()方法进行转换,如下: Int n = Inte ...

  4. 每天一道Java题[6]

    题目 String字符串怎么转换为Date,Date又怎么转换成String字符串 解答 String->Date 主要用到类SimpleDateFormat及其抽象父类DateFormat中的 ...

  5. 每天一道Java题[9]

    题目 native关键字的作用是什么? 解答 首先,需了解JNI(Java Native Interface),它是连接Java平台与本地C代码的一个API. 其次,用native关键字声明的方法,是 ...

  6. 每天一道Java题[1]

    问题:char[]与String相比,有什么优胜的地方? 回答: 针对安全保密高的信息,char[]比String做得更好.因为String是不可变得,即使你修改原先的变量,实际上也是在内存中新建一个 ...

  7. 每天一道Java题[2]

    问题 可以直接根据hashCode()方法产生的值判断两个对象是否相等吗? 解答 不能!根据Wikipedia(https://en.wikipedia.org/wiki/Java_hashCode( ...

  8. 每天一道Java题[5]

    题目 String.StringBuilder.StringBuffer有什么异同? 解答 相同点:String.StringBuilder.StringBuffer都可以用来存储字符串. 不同点: ...

  9. 每天一道Java题[7]

    题目 什么是REST原则,请解释RESTful架构,以及其设计思想? 解答 REST,全称为Representation State Transfer,是一种互联网软件的架构原则.凡是满足REST原则 ...

随机推荐

  1. 05 Training versus Testing

    train:A根据给定训练集D在H中选出g,使得Ein(g)约等于0: test:g在整个输入空间X上的表现要约等于在训练集D上的表现,使得Eout(g)约等于Ein(g). 如果|H|小,更易保证t ...

  2. BS结构中,web如何将数据进行DES加密并写道IC卡中

    在IC卡应用系统中,一般都要对IC卡数据进行DES加密,以保证数据的安全.友我科技RFID读写器云服务2.0充分考虑了这个需求,只需要软件工程师简单的配置即可实现数据的加解密并且写到数据块中.如下图所 ...

  3. iOS图片填充UIImageView(contentMode)

    本文主要形象的介绍一下UIView的contentMode属性: 核心代码 [self.prp_imageView setContentMode:UIViewContentModeScaleAspec ...

  4. Java ---Listener监听器

    在我们的web容器中,一直不断的触发着各种事件,例如:web应用启动和关闭,request请求到达和结束等.但是这些事件通常对于开发者来说是透明的,我们可以根据这些接口开发符合我们自身需求的功能.在w ...

  5. ios 获取当前设备信息、内存

    //在[UIDevice currentDevice]中的属性 @property(nonatomic,readonly,strong) NSString *name; // e.g. "M ...

  6. 2017-4-18 ADO.NET

    1.什么是ADO.NET?     (是一种数据库访问技术) ADO.NET的名称起源于ADO(ActiveX Data Objects),是一个COM组件库,用于在以往的Microsoft技术中访问 ...

  7. python3和python2的区别部分

    字典没有iteritems(),只有items() py2items()返回的是列表,iteritems()返回的是迭代器 py3items()返回的是迭代器

  8. python库安装(numpy+scipy+matplotlib+scikit_learn)

    python安装好后,库安装走了很多弯路,查了很多资料,终于安装成功,并且保存了该文章的地址,分享给大家 本人电脑windows 7,64位系统,安装的Python是3.5的,因此下载的库也是对应版本 ...

  9. Python 基础 一

    Python 基础  一 一.关于Python的介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum),这一两年在国内很流行,应用很广泛. 二.Python的基础知识(1) 1 ...

  10. [进程管理]Linux进程状态解析之R、S、D

    Linux是一个分时操作系统,能够在一个cpu上运行多个程序,每个被运行的程序实例对应一个或多个进程,这里介绍一下Linux进程状态. Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个 ...