1 package com.dragon.test; 2 3 public class MyThread extends Thread{ 4 @Override 5 public void run(){ 6 System.out.println("创建多线程方法一"); 7 } 8 public static void main(String[] args) { 9 MyThread thread=new MyThread(); 10 thread.start(); 11 System.out.println("运行结束"); 12 } 13 14 }
运行结果:
这说明在使用多线程技术时,代码的运行结果与代码执行顺序后调用代码的顺序是无关的 即线程是一个子任务,CPU以随机的时间来调用线程中的方法。 注意:1.不能多次调用Thread中的start()方法,否则会抛出IllegalThreadStateException异常。 2.启动线程的方法不是run()方法而是start方法,如果调用的是run()方法就是同步的,并不能异步执行。 3.执行start()方法的顺序不代表线程启动的顺序,即并不是说,越早调用某个线程的start()方法,它就能 越早的执行其中的run()方法。 2.实现Runnable接口 实现Runnable接口,重写run()方法 例如: 1 package com.dragon.test; 2 3 public class MyThread implements Runnable{ 4 @Override 5 public void run(){ 6 System.out.println("创建多线程方法二"); 7 } 8 public static void main(String[] args) { 9 MyThread thread=new MyThread(); 10 Thread t=new Thread(thread); 11 t.start(); 12 System.out.println("运行结束"); 13 } 14 15 }
运行结果与上述第一种的运行结果没有什么特殊之处 因为Thread类也实现了Runnable接口,所以Thread中的构造函数就可以传入一个Runnable接口的对象,也可以传入一个Thread类的对象
3.实现Callable接口 实现Callable接口,重写call()方法 例如:
package com.dragon.test; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class MyThread implements Callable<string>{ public static void main(String[] args) { ExecutorService threadPool=Executors.newSingleThreadExecutor(); //启动多线程 Future<string> future=threadPool.submit(new MyThread()); try{ System.out.println("waiting thread to finish"); System.out.println(future.get()); }catch(Exception e){ e.printStackTrace(); } } @Override public String call() throws Exception { // TODO Auto-generated method stub return "创建多线程方法三"; } }</string></string>
运行结果:
Callable接口是属于Executor,对比与Runnable接口功能的区别是: (1).Callable可以在任务结束后提供一个返回值,Runnable没有这个功能 (2).Callable中的call()方法可以抛出异常,而Runnable的run()方法不能抛出异常 (3).运行Callable可以拿到一个Future对象,Future独享表示异步计算的结果,它提供了 检查计算是否完成的方法。由于线程属于异步计算模型,因此无法从别的线程中得到函数 的返回值,在这种情况下,就可以使用Future来监视目标线程调用call()方法的情况, 放调用Future的get()方法以获取结果时,当前线程就会阻塞,知道call()方法结束返回结果。