线程(thread)是进程中某个单一顺序的控制流。也被称为轻量进程(lightweight processes)。计算机科学术语,指运行中的程序的调度单位。通俗的来说,线程就是程序执行的线索,每一个线程都是一条在执行的线索,线索可以有很多条,即多线程。
下面我们来看一下Java中创建线程的两种方式:
1.继承Thread类,重写父类的run()方法。
2.实现Runnable接口,实现借口中的run()方法。
下面我们通过简短的代码来看一下。
继承Thread类:
package com.alex.lip.iteye;
/**
* 继承Thread类,并且重写父类Thread中的run()方法。
*/
public class SubThread extends Thread{
@Override
public void run() {
// 写一个死循环,使线程一直处于运行状态
while (true) {
try {
// 线程睡眠500ms
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印输出当前线程的线程名
System.out.println("This class extends Thread====1:" + Thread.currentThread().getName());
// 在此例中,可以使用this代表当前线程的对象,不建议使用。
System.out.println("This class extends Thread====2:" + this.getName());
}
}
}
实现Runnable接口:
package com.alex.lip.iteye;
/**
* 实现Runnable接口,实现其中的run方法
*
*/
public class ThreadExtendsRunnable implements Runnable{
@Override
public void run() {
// 写一个死循环,使线程一直处于运行状态
while (true) {
try {
// 线程睡眠500ms
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
//打印输出当前线程的线程名
System.out.println("This class implements Runnable====1:" + Thread.currentThread().getName());
}
}
}
测试类:
package com.alex.lip.iteye;
public class TestThread {
public static void main(String[] args) {
//=============继承Thread独享===
// 创建一个SubThread对象赋予thread1
Thread thread1 = new SubThread();
// 启动该线程
thread1.start();
//=============实现Runnable接口
// 首先创建一个ThreadExtendsRunnable对象,赋给target
Runnable target = new ThreadExtendsRunnable();
// 将Runnbale对象target当做参数传给Thread的有参构造方法
Thread thread2 = new Thread(target);
// 启动线程
thread2.start();
}
}
输出结果:
This class extends Thread====1:Thread-0
This class extends Thread====2:Thread-0
This class implements Runnable====1:Thread-1
This class extends Thread====1:Thread-0
This class extends Thread====2:Thread-0
This class implements Runnable====1:Thread-1
注:由于是死循环输出,故输出结果很多,在此仅截取一部分结果为例。
下面我们通过源代码来看一下,为什么会有这两种创建线程的方式。大家都知道,线程是通过start()方法启动的,但是线程的执行都在run()方法内,所以我们来看一下Thread类中的run()方法,代码如下:
@Override
public void run() {
if (target != null) {
target.run();
}
}
在run方法中,就简短的两行代码,如果target不为null,则执行target.run()方法。通过查看源代码可以发现,target是一个Runnbale对象。那么在创建线程的过程中也就有了这两种方式,1.继承Thread类,重写run()方法,那么在调用start()后就会调用到子类中重写的run()方法,如果子类没有重写run()方法,那么就会调用父类的run()方法,代码如上,此时即会调用到实现Runnbale接口的对象中实现的的run()方法。所以就会有这两种方式来创建线程。但是此时会有一个疑问,假如这两种方式都存在会怎么样呢?我们看如下的例子。
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Runnable===1:" + Thread.currentThread().getName());
}
}
}) {
public void run() {
while (true) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread===1:" + Thread.currentThread().getName());
}
};
}.start();
运行结果如下:
Thread===1:Thread-0
Thread===1:Thread-0
Thread===1:Thread-0
Thread===1:Thread-0
Thread===1:Thread-0
Thread===1:Thread-0
Thread===1:Thread-0
如果子类中不重写run()方法,则同上面举过的Runnable的例子,这里就不再举例。
注:个人水平有限,如果文中存在不正确地方,希望大家指出,谢谢!
相关推荐
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。
详细的介绍了java中创建两种线程的方法和区别
主要介绍了Java创建线程的两种方式,针对Java创建线程的两种方式进行比较,感兴趣的小伙伴们可以参考一下
* 创建线程有两种方式: 1.实现Runnable接口 2.继承Thread类 * 实现方式和继承方式有啥区别? * 实现方式的好处:避免了单继承的局限性 在定义线程时. * 建议使用实现方式 * 区别: * 继承Thread:线程代码存放...
Java多线程--对比创建多线程的两种方式
在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口。那么这两种方式孰优孰劣呢?这就是本文需要探讨的内容范畴了,看官们请仔细向下看
JAVA线程的两种创建方式及优劣比较.pdf
java创建子线程为什么要有两种方法---马克-to-win java视频
主要介绍了Java创建子线程的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
java创建子线程为什么要有两种方法4---马克-to-win java视频
java创建子线程为什么要有两种方法3---马克-to-win java视频
java创建子线程为什么要有两种方法2---马克-to-win java视频
线程入门,创建线程、线程的几种状态、线程排序、线程池入门。
主要为大家区分了java创建线程的两种方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立一个Thread实例。因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例。
为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承,也是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程
Java 创建线程有两种方式: 继承Thread类,并重写run()方法 实现Runnable接口,覆盖接口中的run()方法,并把Runnable接口的实现扔给Thread 面试官:(拿出一张白纸)那你把这两种方式写一下吧! 小哥:(这有何难!...
主要介绍了Java创建和启动线程的两种方式,结合实例形式分析了java多线程创建、使用相关操作技巧与注意事项,需要的朋友可以参考下
主要介绍了Java多线程中线程的两种创建方式及比较代码示例,简单介绍了线程的概念,并行与并发等,然后通过实例代码向大家展示了线程的创建,具有一定参考价值,需要的朋友可以了解下。