1)java多线程的创建方式有三种:
1.继承Thread类
2.实现Runnable接口
3.实现Callable接口
第一种:
1 //继承Thread类 2 class ExtendsThread extends Thread{ 3 public void run(){ 4 //do your stuff 5 } 6 } 7 ExtendsThread e = new ExtendsThread(); 8 e.start();
第二种:
1 //实现Runnable接口 2 class ImpleRunnableThread implements Runnable{ 3 @Override 4 public void run() { 5 //do your stuff 6 } 7 } 8 ImpleRunnableThread ir = new ImpleRunnableThread(); 9 Thread t = new Thread(ir); 10 t.start();
第三种是jdk1.5以后提供的:
1 //实现Callable接口 2 class ImpleCallableThread implements Callable{ 3 @Override 4 public Object call() throws Exception { 5 // TODO do you stuff 6 return null; 7 } 8 } 9 ImpleCallableThread ic = new ImpleCallableThread(); 10 FutureTask<String> task = new FutureTask<String>(ic); 11 new Thread(task,"有返回值的线程").start();
2)可以看到线程启动用的是start这个方法,为什么呢?打开start()源码可以看到,在Thread类里start()调用了 private native void start0();native关键字表示调动的是操作系统的底层函数,这样的技术成为JNI(Java Native Interface)。
3)看看线程的执行顺序情况:
1 for(int i =0;i<5;i++){ 2 Thread thread = new Thread(""+i){ 3 public void run() { 4 System.out.println("run...."+ getName()); 5 } 6 }; 7 thread.start(); 8 }
output:
虽然启动线程的顺序是有序的,但是执行线程的顺序并非是有序的,因为线程是并行执行而非顺序的,它的执行顺序由JVM和操作系统一起决定。
4)如果同时使用继承Thread类、Runnable接口这两种的话,执行的是哪个run方法呢?
1 new Thread(new Runnable(){ 2 @Override 3 public void run() { 4 // do your stuff 1 5 } 6 }){ 7 public void run(){ 8 //do your stuff 2 9 } 10 };
以上代码相当于new Thread(new Runnable(){run()}){run()},由于Thread类本身实现了Runnable接口,所以如果自身重写了run方法的话,那么就会覆盖父类的方法,所以会执行第二个run方法。
下一篇说明这三种创建方式的区别。