实现多线程编程可以有三种方法:
继承Thread类、实现Runnable接口、在方法内部用匿名内部类来直接创建并启动新的线程。
这里先讨论前两种方式:
继承Thread类:
public class ThreadTest extends Thread {
private String name;
public ThreadTest(){
}//如果子类中不覆盖父类的无参构造函数,JVM在初始化实例时会自动调用父类的无参构造函数
public ThreadTest(String name){
this.name=name;
}
public void run()
{
for(int i=0;i<10;i++)
System.out.println(name+"run");
}
public static void main(String[] args){
ThreadTest test1=new ThreadTest("T1");
ThreadTest test2=new ThreadTest("T2");
test1.start();
test2.start();
}
}
实现Runnable接口:
public class RunnableTest implements Runnable {
private String name;
public RunnableTest(String name){
this.name=name;
}
public void run()
{
for(int i=0;i<10;i++)
System.out.println(name+"run");
}
public static void main(String args[])
{
RunnableTest run1=new RunnableTest("r1");
Thread demo1=new Thread(run1);
RunnableTest run2=new RunnableTest("r2");
Thread demo2=new Thread(run2);
demo1.start();
demo2.start();
}
}
以上两种方式均可以实现多线程。但是两者有着区别,继承Thread类不容易共享资源,但实现接口就比较容易共享资源。
比如用继承的方式:
public class ThreadShare extends Thread{
private String name;
public ThreadShare(){
}
public ThreadShare(String name){
this.name=name;
}
public void run(){
for(int i=5;i>0;i--)
System.out.println(name+" "+i);
}
public static void main(String[] args){
ThreadShare T1=new ThreadShare("Thread1");
ThreadShare T2=new ThreadShare("Thread2");
ThreadShare T3=new ThreadShare("Thread3");
T1.start();
T2.start();
T3.start();
}
}
运行结果如图:
用实现接口的方式:
public class RunnableShare implements Runnable{
private int ticket=5;
public void run(){
for (int i = 0; i <=20; i++) {
if(this.ticket>0){
System.out.println(Thread.currentThread().getName()+this.ticket--);
}
}
}
public static void main(String[] args){
RunnableShare r1=new RunnableShare();
new Thread(r1,"一号窗口").start();
new Thread(r1,"二号窗口").start();
new Thread(r1,"三号窗口").start();
}
}
运行结果如图: