Java多线程Runnable与Thread的区别

时间:2021-03-06 17:34:53

简介

在创建线程的时候会用到Runnable和Thread,这两者除过基本的区别之外,我根据自己的理解说说我对他的理解。

示例代码(摘录)

package com.ray.deepintothread.ch01.topic_3;

public class CurrentThreadSample {
public static void main(String[] args) {
ThreadFive threadFive = new ThreadFive();
Thread thread = new Thread(threadFive, "myThread");// 设置运行线程的名称
threadFive.setName("threadFive");// 设置实例的名称
threadFive.myTest();
thread.start();
}
}

class ThreadFive extends Thread {
public void myTest() {
show();
}

private void show() {
System.out.println("----------begin----------");
// 这里指的是执行这个线程的名称
System.out.println("Thread name:" + Thread.currentThread().getName());
System.out.println(this);
// this.getName指的是这个实例的名称
// 由于是继承Thread,Thread本身可以设置名称
System.out.println("Instance name:" + this.getName());
System.out.println("----------end----------");
}

@Override
public void run() {
super.run();
show();
}
}
情景: 如果需要被调用的线程对象是通过实现Runnable接口实现的,那么在启动线程的时候必须通过Thread类创建一个线程实例,然后将继承了Runnable的类的实例作为参数传给Thread,之后才能启动线程,而不能直接通过Runnable的实现了创建的实例来启动。但是如果被调用的线程类是通过继承Thread类而来,那么就可以通过线程类的实例直接启动。

分析:通过实现Runnable接口而来的线程类实例化来的实例只是一个任务,并不具有线程的特性,这个任务要作为单独的线程去执行,必须传给Thread实例对象。而通过Thread实例化的实例才是真正意义上的线程对象。