代表线程的是类Thread和接口runnable,因此可以通过两种方式来实现多线程。
1) 继承Thread类
例子:
PrintThread类继承了Thread,然后实现run()方法。
public class PrintThread extendsThread{
String name;publicPrintThread(String name)
{this.name =name;
}public voidprint()
{
System.out.print(name+ " start to print ");try{
Thread.sleep(3000);
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name+ " finished print ");
}public voidrun()
{
print();
}
}
2)实现Runnable接口
public class PrintThread implementsRunnable{
String name;publicPrintThread(String name)
{this.name =name;
}public voidprint()
{
System.out.print(name+ " start to print ");try{
Thread.sleep(3000);
}catch(InterruptedException e) {//TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(name+ " finished print ");
}public voidrun()
{
print();
}
}
线程写好了,那怎么使用呢,两种用法的使用者有什么不同呢
对于extends写法,可有3种写法,其实是第一个和第二个其实是1种,第2个是用多了多态。
public class TestPrint {
public static void main(String[] args) {
//Thread t1 = new Thread(new PrintThread("t1"));
PrintThread t1 = new PrintThread("t1");
//
Thread t2 = new PrintThread("t2");
//Thread t1 = new Thread(new PrintThread("t1"));
//Thread t2 = new Thread(new PrintThread("t2"));
Thread t3 = new Thread(new PrintThread("t3"));
t1.start();
t2.start();
t3.start();
}
}
把原来PrintThread改为implements Runnable后,上面的测试类TestPrint不能编译通过,这是因为
1) t1对象能成功创建,但是不能成功调用start方法,因为runnable接口中只有run方法,没有start()方法。
2)t2对象不能成功创建,因为Thread类实现了runnable接口,PrintThread类也实现了Runnable接口,但是这2个类没有父子关系
3)t3能创建成功,也能调用start()方法启动线程。
所以实现Runnable接口的对象只能通过Thread(Runnable targe)构造函数来创建线程。
于是测试类变成:
public classTestPrint {public static voidmain(String[] args) {//TODO Auto-generated method stub
Thread t1= new Thread(new PrintThread("t1"));
Thread t2= new Thread(new PrintThread("t2"));
Thread t3= new Thread(new PrintThread("t3"));
t1.start();
t2.start();
t3.start();
}
}
总结:
1)extends用法调用时有2种写法: new thread(new PrintThread()), 或者直接 new PrintThread().
2) Runnable用法调用时只能 New Thread(new PrintThread()).