java thread写法
代表线程的是类Thread和接口runnable,因此可以通过两种方式来实现多线程。
1) 继承Thread类
例子:
PrintThread类继承了Thread,然后实现run()方法。
public class PrintThread extends Thread{ String name; public PrintThread(String name) { this.name = name; } public void print() { 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 void run() { print(); } }
2)实现Runnable接口
public class PrintThread implements Runnable{ String name; public PrintThread(String name) { this.name = name; } public void print() { 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 void run() { 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 class TestPrint { public static void main(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()).