每天一道Java题[10]
题目
阐述创建线程最常用的两种方法及其对比。
解答
方法一:继承Thread类实现
步骤:
- 创建Thread类的子类,如MyThread。
- 重写Thread类的run()方法。
- 实例化MyThread类,对象名如myThread。
- 运用Thread类的start()方法启动线程,如myThread.start()。
方法二:实现Runnable接口
步骤:
- 创建一个类,如MyRunnableThread,实现Runnable接口。
- 创建MyRunnableThread类的对象。
- 实例化Thread类,对象名如thread,并向其构造函数传入MyRunnableThread类和线程名两个参数。
- 运用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]的更多相关文章
- 每天一道Java题[11]
题目 synchronized怎么实现线程同步?请修改<每天一道Java题[10]>中的MyRunnableThread类以解决三个线程都获取到10的问题. 解答 方法一: 采用synch ...
- 每天一道Java题[3]
问题 为什么在重写equals()方法的同时,必须重写hashCode()方法? 解答 在<每天一道Java题[2]>中,已经对hashCode()能否判断两个对象是否相等做出了解释.eq ...
- 每天一道Java题[4]
问题 怎么将字符串转换为int? 解答 此题看似简单,但经常出现在笔试等地方,由于大家习惯了用IDE,有什么还真未必能写出来.通常都是parseInt()方法进行转换,如下: Int n = Inte ...
- 每天一道Java题[6]
题目 String字符串怎么转换为Date,Date又怎么转换成String字符串 解答 String->Date 主要用到类SimpleDateFormat及其抽象父类DateFormat中的 ...
- 每天一道Java题[9]
题目 native关键字的作用是什么? 解答 首先,需了解JNI(Java Native Interface),它是连接Java平台与本地C代码的一个API. 其次,用native关键字声明的方法,是 ...
- 每天一道Java题[1]
问题:char[]与String相比,有什么优胜的地方? 回答: 针对安全保密高的信息,char[]比String做得更好.因为String是不可变得,即使你修改原先的变量,实际上也是在内存中新建一个 ...
- 每天一道Java题[2]
问题 可以直接根据hashCode()方法产生的值判断两个对象是否相等吗? 解答 不能!根据Wikipedia(https://en.wikipedia.org/wiki/Java_hashCode( ...
- 每天一道Java题[5]
题目 String.StringBuilder.StringBuffer有什么异同? 解答 相同点:String.StringBuilder.StringBuffer都可以用来存储字符串. 不同点: ...
- 每天一道Java题[7]
题目 什么是REST原则,请解释RESTful架构,以及其设计思想? 解答 REST,全称为Representation State Transfer,是一种互联网软件的架构原则.凡是满足REST原则 ...
随机推荐
- Ubuntu离线安装Sogou拼音(附老版本安装&输入法自启动)
跨平台系列汇总:http://www.cnblogs.com/dunitian/p/4822808.html#linux 离线安装的基础可以看看这篇文章的 前期准备工作 http://www.cnbl ...
- 如何在Windows系统下安装Linux虚拟机
先安装虚拟机这个软件,然后在虚拟机里装linux. 1,准备,下载VM虚拟机,链接: http://pan.baidu.com/s/1z79oU 密码: vbap.和linux镜像文件,可以下载ubu ...
- 解决移动端click点击问题
下载地址:https://github.com/ftlabs/fastclick 1,为什么移动端点击会有300ms的延迟呢? 从点击屏幕上的元素到触发元素的 click 事件,移动浏览器会有大约 3 ...
- React组件实现越级传递属性
如果有这样一个结构:三级嵌套,分别是:一级父组件.二级子组件.三级孙子组件,且前者包含后者,结构如图: 如果把一个属性,比如color,从一级传递给三级,一般做法是使用props逐一向下传递,代码如下 ...
- 【one day one linux】grep工具
grep 筛选功能 学习这些命令采用20/80原则,这样,可以达到使用%20的命令选项,处理80%的情况. #grep 的使用格式 grep [option] pattern file 那么接下来看 ...
- 【PAT_Basic日记】1002. 写出这个数
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { void print ...
- golang环境
Golang是谷歌开发的一款开源性语言,暂时比较方便的IDE有Inteillj Idea.LiteIDE.Eclipse(Golipse)等,使用起来比较方便的IDE:LiteIDE和Inteillj ...
- 初学strurs基础
Struts2基础学习总结 Struts 2是在WebWork2基础发展而来的. 注意:struts 2和struts 1在代码风格上几乎不一样. Struts 2 相比Struts 1的优点: 1. ...
- jquery使用CSS3实现文字动画效果插件Textillate.js
Textillate是一款基于jquery的使用CSS3实现文字动画的小巧插件.Textillate.js集成了一些很棒的使用CSS3动画效果的 JavaScript 库,您可非常轻轻松地把这些动画效 ...
- Machine Learning——Supervised Learning(机器学习之监督学习)
监督学习是指:利用一组已知类别的样本调整分类器的参数,使其达到所要求性能的过程. 我们来看一个例子:预测房价(注:本文例子取自业界大牛吴恩达老师的机器学习课程) 如下图所示:横轴表示房子的面积,单位是 ...