java中多线程Runnable接口和Thread类的区别

时间:2021-05-06 17:31:48

我想用四个不用的线程去卖共同100张票。
先看继承Thread类的代码:

class ThreadDemo1 {
public static void main(String[] args) {
TestThread tt = new TestThread();
tt.start();
tt.start();
tt.start();
tt.start();
}

}

class TestThread extends Thread {
int tickets = 100;

public void run() {
while (true) {
if (tickets > 0)
System.out.println(Thread.currentThread().getName()
+ " is saling ticket " + tickets--);
}
}
}

运行结果:
java中多线程Runnable接口和Thread类的区别

从运行结果可以看到只有一个线程在买票,因为只创建了一个TestThread对象。如果我们想创建四个不同的对象可以由如下代码:

class ThreadDemo1 {
public static void main(String[] args) {
new TestThread().start();
new TestThread().start();
new TestThread().start();
new TestThread().start();
}

}

class TestThread extends Thread {
int tickets = 100;

public void run() {
while (true) {
if (tickets > 0)
System.out.println(Thread.currentThread().getName()
+ " is saling ticket " + tickets--);
}
}
}

运行结果:
java中多线程Runnable接口和Thread类的区别

从运行结果可以看到这不是一个线程共同买100张票,而是每个线程买自己的100张票,要实现共同买100张票就要使用Runnable接口,看下面代码:

class ThreadDemo1 {
public static void main(String[] args) {
TestThread tt = new TestThread();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();
new Thread(tt).start();

}
}

class TestThread implements Runnable {
int tickets = 100;

public void run() {
while (true) {
if (tickets > 0)
System.out.println(Thread.currentThread().getName()
+ " is saling ticket " + tickets--);
}
}
}

运行结果:
java中多线程Runnable接口和Thread类的区别

这样就实现了用四个线程共同买100张票。

通过这个例子我们可以了解到通过Runnable接口来创建多线程比Thread类的继承创建多线要灵活。几乎在所有多线程应用都用Runnable来实现。它适合多个相同程序代码的线程去处理同一资源的情况,把虚拟CPU(线程)同程序的代码、数据有效分离,较好地体现了面向对象的设计思想。