Java中Runnable和Thread的区别

时间:2022-12-16 17:35:49

概述

Runnable 是接口。

Thread 是类,且实现了Runnable接口。

Thread部分源码

public class Thread
implements Runnable
{
private static class Caches
{

static final ConcurrentMap subclassAudits = new ConcurrentHashMap();
static final ReferenceQueue subclassAuditsQueue = new ReferenceQueue();

在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。

public interface Runnable
{

public abstract void run();
}

Thread类,有一个构造方法:public Thread(Runnable targer)

    public Thread(Runnable runnable)
{
daemon = false;
stillborn = false;
threadLocals = null;
inheritableThreadLocals = null;
threadStatus = 0;
blockerLock = new Object();
init(null, runnable, (new StringBuilder()).append("Thread-").append(nextThreadNum()).toString(), 0L);
}

此构造方法接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。


使用情况

在程序开发中只要是多线程肯定永远以实现Runnable接口为主。

实现Runnable接口相比继承Thread类有如下好处:
1、避免点继承的局限,一个类可以继承多个接口。
2、适合于资源的共享。


实例

以卖票为例,总共只有10张动车票了,全国3个窗口在卖。


继承Thread类的方法

package multithreading;

public class MyThreadWithExtends extends Thread {

private int tickets = 10;

@Override
public void run() {

for (int i = 0; i <= 100; i++) {
if(tickets>0){
System.out.println(Thread.currentThread().getName()+"--卖出票:" + tickets--);
}
}
}


public static void main(String[] args) {
MyThreadWithExtends thread1 = new MyThreadWithExtends();
MyThreadWithExtends thread2 = new MyThreadWithExtends();
MyThreadWithExtends thread3 = new MyThreadWithExtends();

thread1.start();
thread2.start();
thread3.start();

//每个线程都独立,不共享资源,每个线程都卖出了10张票,总共卖出了30张。如果真卖票,就有问题了。
}

}

运行结果:

Thread-0--卖出票:10
Thread-2--卖出票:10
Thread-1--卖出票:10
Thread-2--卖出票:9
Thread-0--卖出票:9
Thread-2--卖出票:8
Thread-1--卖出票:9
Thread-2--卖出票:7
Thread-0--卖出票:8
Thread-2--卖出票:6
Thread-2--卖出票:5
Thread-2--卖出票:4
Thread-1--卖出票:8
Thread-2--卖出票:3
Thread-0--卖出票:7
Thread-2--卖出票:2
Thread-2--卖出票:1
Thread-1--卖出票:7
Thread-0--卖出票:6
Thread-1--卖出票:6
Thread-0--卖出票:5
Thread-0--卖出票:4
Thread-1--卖出票:5
Thread-0--卖出票:3
Thread-1--卖出票:4
Thread-1--卖出票:3
Thread-1--卖出票:2
Thread-0--卖出票:2
Thread-1--卖出票:1
Thread-0--卖出票:1

每个线程都独立,不共享资源,每个线程都卖出了10张票,总共卖出了30张。如果真卖票,就有问题了。


实现Runnable接口方式

package multithreading;

public class MyThreadWithImplements implements Runnable {

private int tickets = 10;

@Override
public void run() {

for (int i = 0; i <= 100; i++) {
if(tickets>0){
System.out.println(Thread.currentThread().getName()+"--卖出票:" + tickets--);
}
}
}


public static void main(String[] args) {
MyThreadWithImplements myRunnable = new MyThreadWithImplements();
Thread thread1 = new Thread(myRunnable, "窗口一");
Thread thread2 = new Thread(myRunnable, "窗口二");
Thread thread3 = new Thread(myRunnable, "窗口三");

thread1.start();
thread2.start();
thread3.start();
}

}

运行结果:

窗口二--卖出票:10
窗口三--卖出票:9
窗口一--卖出票:8
窗口三--卖出票:6
窗口三--卖出票:4
窗口三--卖出票:3
窗口三--卖出票:2
窗口三--卖出票:1
窗口二--卖出票:7
窗口一--卖出票:5

每个线程共享了对象myRunnable的资源,卖出的总票数是对的,但是顺序是乱的,怎么办?

见:


-------------

更多的Java,Angular,Android大数据,J2EE,Python数据库Linux,Java架构师,:

http://www.cnblogs.com/zengmiaogen/p/7083694.html