您的位置:首页 > 编程语言 > Java开发

Java线程总结(一):创建线程的两种方式Thread和Runnable

2016-09-07 21:02 633 查看
实现线程的方式有两种:一种是继承Thread类,一种是实现Runnable接口。

首先看下两种实现方式,然后简单讨论下这两种方式执行原理?

第一种方式:继承Thread

package ydj;

public class ThreadDemo {
public static void main(String[] args) {
Thread thread1 = new MyThread1();
thread1.start();//启动线程
}
}
class MyThread1 extends Thread{
//覆盖父类run方法
public void run() {
while (true) {
System.out.println("Thread--1:" + Thread.currentThread().getName());
try{// run方法中的异常不可抛出,只能try
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

第二种方式:实现Runnable接口

package ydj;

public class ThreadDemo2 {
public static void main(String[] args) {
Thread thread2 = new Thread(new MyThread2());
thread2.start();//启动线程
}
}
class MyThread2 implements Runnable{
//实现run方法
@Override
public void run() {
while (true) {
System.out.println("Thread--2:" + Thread.currentThread().getName());
try{// run方法中的异常不可抛出,只能try
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

两种方式执行原理



从源码可以看到Thread实现了Runnable接口,方式二在new Thread时传入了一个Runnable对象(赋给target),Thread的run方法就是调用Runnable的run方法,所以启动线程时就执行了Runnable对象的run方法。
方式一Thread的子类覆盖了run方法,启动线程时就直接执行子类自己的run方法。

这两种创建方式没有说哪一种更好,在不同场景下选择合适的方式就行,但实现Runnable接口的方式用的更多。

了解了两种方式运行的原理后,就很容易分析下面的代码怎么执行的了
new Thread(new Runnable() {//传入实现Runnable接口对象
@Override
public void run() {
System.out.println("runnable");
}
}){
@Override
public void run() {//覆盖run方法
System.out.println("thread");
}
}.start();


子类run方法实际就是覆盖父类中的run方法,如果覆盖了就用子类的run方法,不会再找Runnable中的run方法了,所以运行的是子类中的run方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐