原:http://mars914.iteye.com/blog/1508429
Java中线程的创建有两种方式:
一是写一个类继承自Thread类,然后重写里面的run方法,用start方法启动线程
二是写一个类实现Runnable接口,实现里面的run方法,用new Thread(Runnable target).start()方法来启动
在实际应用中,我们经常用到多线程,如车站的售票系统,车站的各个售票口相当于各个线程。当我们做这个系统的时候可能会想到两种方式来实现,继承Thread类或实现Runnable接口,现在看一下这两种方式实现的两种结果。
package com.test;
class MyThead extends Thread {
private int ticket = 10;
private String name;
public MyThead(String name) {
this.name = name;
}
public void run() {
for (int i = 0; i < 500; i++) {
if (this.ticket>0) {
System.out.println(this.name+"卖出第"+(10-this.ticket-- + 1)+"票");
}
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
MyThead mt1 = new MyThead("一号窗口");
MyThead mt2 = new MyThead("二号窗口");
MyThead mt3 = new MyThead("三号窗口");
mt1.start();
mt2.start();
mt3.start();
}
}<span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;">
</span></span>
运行结果如下:
二号窗口卖出第1票
二号窗口卖出第2票
一号窗口卖出第1票
二号窗口卖出第3票
一号窗口卖出第2票
二号窗口卖出第4票
二号窗口卖出第5票
二号窗口卖出第6票
三号窗口卖出第1票
三号窗口卖出第2票
三号窗口卖出第3票
三号窗口卖出第4票
三号窗口卖出第5票
三号窗口卖出第6票
三号窗口卖出第7票
三号窗口卖出第8票
三号窗口卖出第9票
三号窗口卖出第10票
二号窗口卖出第7票
二号窗口卖出第8票
一号窗口卖出第3票
一号窗口卖出第4票
一号窗口卖出第5票
一号窗口卖出第6票
一号窗口卖出第7票
一号窗口卖出第8票
一号窗口卖出第9票
一号窗口卖出第10票
二号窗口卖出第9票
二号窗口卖出第10票
通过实现Runnable接口的代码如下
package com.test;
class MyThead implements Runnable {
private int ticket = 10;
public void run() {
for (int i = 0; i < 500; i++) {
if (this.ticket > 0) {
System.out.println(Thread.currentThread().getName() + "卖出第"
+ (10 - this.ticket-- + 1) + "票");
}
}
}
}
public class ThreadDemo {
public static void main(String[] args) {
// 设计三个现程
MyThead mt = new MyThead();
Thread t1 = new Thread(mt, "一号窗口");
Thread t2 = new Thread(mt, "二号窗口");
Thread t3 = new Thread(mt, "三号窗口");
t1.start();
t2.start();
t3.start();
}
}
运行结果:
一号窗口卖出第1票
一号窗口卖出第4票
二号窗口卖出第2票
三号窗口卖出第3票
二号窗口卖出第6票
三号窗口卖出第7票
一号窗口卖出第5票
一号窗口卖出第9票
一号窗口卖出第10票
二号窗口卖出第8票
为什么会出现这种结果呐。我们不妨做个比喻,其实刚才的程序,
继承Thread类的,我们相当于拿出三件事即三个卖票10张的任务分别分给三个窗口,他们各做各的事各卖各的票各完成各的任务,因为MyThread继承Thread类,所以在new MyThread的时候在创建三个对象的同时创建了三个线程;
实现Runnable的, 相当于是拿出一个卖票10张得任务给三个人去共同完成,new MyThread相当于创建一个任务,然后实例化三个Thread,创建三个线程即安排三个窗口去执行。
用图表示如下:
在我们刚接触的时候可能会迷糊继承Thread类和实现Runnable接口实现多线程,其实在接触后我们会发现这完全是两个不同的实现多线程,一个是多个线程分别完成自己的任务,一个是多个线程共同完成一个任务。
其实在实现一个任务用多个线程来做也可以用继承Thread类来实现只是比较麻烦,一般我们用实现Runnable接口来实现,简洁明了。
大多数情况下,如果只想重写 run() 方法,而不重写其他 Thread 方法,那么应使用 Runnable 接口。这很重要,因为除非程序员打算修改或增强类的基本行为,否则不应为该类(Thread)创建子类。