每天一道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原则 ...
随机推荐
- Android ShellUtils
Android中执行Shell命令的工具类 public class ShellUtils { public static final String COMMAND_SU = "su&quo ...
- 03 Types of Learning
学习的分类: 根据输出空间Y:分类(二分类.多分类).回归.结构化(监督学习+输出空间有结构): 根据标签y:监督学习.无监督学习(聚类.密度估计.异常点检测).半监督学习(标注成本高时).强化学习: ...
- lua 条件控制
lua 条件控制 if 语句 结构 if (condition) then statements end 示例程序 local a = 10 if (a > 1) then print(&quo ...
- 单片机下载芯片max232,ch340,pl2303,hl340与下载接线
开发板上的下载口位置一般都有很多 340,232等芯片,这些芯片都是干嘛用的呢? 普及:TTL电平 : 二进制电平,+5V等价于逻辑"1",0V等价于逻辑"0&qu ...
- OpenCV 玩九宫格数独(二):knn 数字识别
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:刘潇龙 前言 首先需要说明,这里所说的数字识别不是手写数字识别! 但凡对机器学习有所了解的人,相信看到数 ...
- python——模块
一.导入模块 Python之所以应用越来越广泛,在一定程度上也依赖于其为程序员提供了大量的模块以供使用,如果想要使用模块,则需要导入.导入模块有一下几种方法: 1 import module 2 fr ...
- [ext4]空间管理 - 查找块
在文件系统中,当需要执行写操作时,肯定是需要查找需要写入的块.那么如何查找块哪? 在Ext4系统中,有两个函数是可能执行查找操作的:ext4_getblk().ext4_get_block(). ...
- register_sysctl_table实现内核数据交互
作者:Younger Liu, 本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可. Sysctl是一种用户应用来设置和获得运行时内核的配置参数的一种有效方式,通 ...
- [进程管理]Linux进程状态解析之R、S、D
Linux是一个分时操作系统,能够在一个cpu上运行多个程序,每个被运行的程序实例对应一个或多个进程,这里介绍一下Linux进程状态. Linux是一个多用户,多任务的系统,可以同时运行多个用户的多个 ...
- jQuery选择器与CSS选择器
1. 通过位置选择的几个操作: :first:默认情况下是相对整个页面来说的第一个,如:li:first表示整个页面的第一个li元素,而ul li:first表示整个页面的第一个li元素,并且是在ul ...