在Java中,可以通过实现Runnable接口或继承Thread类这两种方式来创建线程。那么这两种方式有什么区别呢?为了说明这两种方法的区别,我们设计了一组实验。通过实验得到的结果,来对这两种不同的方法进行对比。
首先,创建了两个类:RunnableTest类和ThreadTest类。这两个类分别实现了Runnable接口及继承了Thread类。
class RunnableTest implements Runnable
{
private int count=0;
@Override
public void run()
{
while(this.count < 10)
{
this.count ++;
System.out.print(Thread.currentThread().getName()+ ":" + this.count + " ");
}
}
}
class ThreadTest extends Thread
{
private int count = 0;
public void run()
{
while(this.count<10)
{
this.count ++;
System.out.print(Thread.currentThread().getName() + ":" + this.count + " ");
}
}
}
我们另外定义一个类RunnableAndThreadTest,并在该类中实现main()函数,来对刚才创建的这两个类进行测试。
测试一:
public class RunnableAndThreadTest
{
public static void main(String[] args)
{
RunnableTest runnableTest1 = new RunnableTest();
RunnableTest runnableTest2 = new RunnableTest();
Thread thread1 = new Thread(runnableTest1);
Thread thread2 = new Thread(runnableTest2);
thread1.start();
thread2.start();
}
}
实验结果:
Thread-1:1 Thread-0:1 Thread-1:2 Thread-0:2 Thread-1:3 Thread-0:3 Thread-1:4 Thread-0:4 Thread-1:5 Thread-0:5 Thread-0:6 Thread-0:7 Thread-1:6 Thread-0:8 Thread-1:7 Thread-0:9 Thread-1:8 Thread-0:10 Thread-1:9 Thread-1:10
测试二:
public class RunnableAndThreadTest
{
public static void main(String[] args)
{
RunnableTest runnableTest1 = new RunnableTest();
// RunnableTest runnableTest2 = new RunnableTest();
Thread thread1 = new Thread(runnableTest1);
Thread thread2 = new Thread(runnableTest1);
thread1.start();
thread2.start();
}
}
实验结果:
Thread-0:2 Thread-1:2 Thread-0:3 Thread-1:4 Thread-0:5 Thread-1:6 Thread-0:7 Thread-1:8 Thread-0:9 Thread-1:10
测试三:
public class RunnableAndThreadTest
{
public static void main(String[] args)
{
ThreadTest threadTest1 = new ThreadTest();
ThreadTest threadTest2 = new ThreadTest();
threadTest1.start();
threadTest2.start();
}
}
实验结果:
Thread-0:1 Thread-1:1 Thread-0:2 Thread-1:2 Thread-0:3 Thread-1:3 Thread-0:4 Thread-1:4 Thread-0:5 Thread-1:5 Thread-1:6 Thread-1:7 Thread-1:8 Thread-1:9 Thread-1:10 Thread-0:6 Thread-0:7 Thread-0:8 Thread-0:9 Thread-0:10
结论:
1>如果某一个类实现了Runnable接口,那么这个类实际上是一个任务类。这个任务类的某一个对象可以使用多个线程进行包装,在这种情况下将会有多个线程来共同执行这个任务。
2>如果一个类继承了Thread类,那么这个类的对象就已经是一个线程,无法实现使用多个线程执行同一个任务。