摘要:
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口;Thread类是在java.lang包中定义的。一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限。
用法:
Thread:
package org.thread.demo;
class MyThread extendsThread{privateString name;publicMyThread(String name) {super();this.name =name;
}public voidrun(){for(int i=0;i<10;i++){
System.out.println("线程开始:"+this.name+",i="+i);
}
}
}
package org.thread.demo;
import org.thread.demo.MyThread;
public classThreadDemo01 {public static voidmain(String[] args) {
MyThread mt1=new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
mt1.run();
mt2.run();
}
}
但是,此时结果很有规律,先第一个对象执行,然后第二个对象执行,并没有相互运行。
public classThreadDemo01 {public static voidmain(String[] args) {
MyThread mt1=new MyThread("线程a");
MyThread mt2=new MyThread("线程b");
mt1.start();
mt2.start();
}
}
这样程序可以正常完成交互式运行。
Runnable:
public interfaceRunnable{public voidrun();
}
packageorg.runnable.demo;class MyThread implementsRunnable{privateString name;publicMyThread(String name) {this.name =name;
}public voidrun(){for(int i=0;i<100;i++){
System.out.println("线程开始:"+this.name+",i="+i);
}
}
}
importorg.runnable.demo.MyThread;public classThreadDemo01 {public static voidmain(String[] args) {
MyThread mt1=new MyThread("线程a");
MyThread mt2=new MyThread("线程b");newThread(mt1).start();newThread(mt2).start();
}
}
在使用Runnable定义的子类中没有start()方法,只有Thread类中才有。Thread类,有一个构造方法:public Thread(Runnable targer)接受Runnable的子类实例,也就是说可以通过Thread类来启动Runnable实现的多线程。
区别:
Thread:
packageorg.demo.dff;class MyThread extendsThread{private int ticket=10;public voidrun(){for(int i=0;i<20;i++){if(this.ticket>0){
System.out.println("卖票:ticket"+this.ticket--);
}
}
}
}
packageorg.demo.dff;public classThreadTicket {public static voidmain(String[] args) {
MyThread mt1=newMyThread();
MyThread mt2=newMyThread();
MyThread mt3=newMyThread();
mt1.start();//每个线程都各卖了10张,共卖了30张票
mt2.start();//但实际只有10张票,每个线程都卖自己的票
mt3.start();//没有达到资源共享
}
}
Rannable:
packageorg.demo.runnable;class MyThread implementsRunnable{private int ticket=10;public voidrun(){for(int i=0;i<20;i++){if(this.ticket>0){
System.out.println("卖票:ticket"+this.ticket--);
}
}
}
}
packageorg.demo.runnable;public classRunnableTicket {public static voidmain(String[] args) {
MyThread mt=newMyThread();new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一
new Thread(mt).start();//个实例化对象mt,就会出现异常
newThread(mt).start();
}
}
虽然现在程序中有三个线程,但是一共卖了10张票,也就是说使用Runnable实现多线程可以达到资源共享目的。
原文:
追寻.java线程系列---Runnable和Thread的区别[2012-03-01](2014-07-11).http://blog.csdn.net/wwww1988600/article/details/7309070