Thread 创建的三种方式
转载自 https://blog.csdn.net/hellorichen/article/details/53127719
Java中创建线程主要有三种方式:
一、继承Thread类创建线程类
①定义Thread类的子类,并重写run方法。
②创建Thread子类的实例。
③调用start()方法。
访问当前线程:Thread.currentThread().
二、通过Runnable接口创建线程类
同上,只是改为定义runnable接口的实现类。
启动 new Thread(Runnable r,String name).start();
例:
1 new Thread(new Run(),"r1").start();
Run为Runnable接口的实现类。或者写为:
1 package thread; 2 3 public class Main { 4 public static void main(String[] args) { 5 new Thread(new Runnable(){ 6 @Override 7 public void run() { 8 System.out.println("run()"); 9 }},"r1").start(); 10 } 11 }
接口不可实例化,所以参数必须为实现接口的类或匿名类。
三、通过Callable和FutureTask创建线程
①创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,并且有返回值。
1 package thread; 2 3 import java.util.concurrent.Callable; 4 5 public class MyCallable implements Callable<Integer>{ 6 @Override 7 public Integer call() throws Exception { 8 // TODO Auto-generated method stub 9 return 1111; 10 } 11 12 }
②创建Callable实现类的实例,使用FutureTask类来包装Callable对象,该FutureTask对象封装了该Callable对象的call()方法的返回值。
③使用FutureTask对象作为Thread对象的target创建并启动新线程,FutureTask是Runnable的子类
④调用FutureTask对象的get()方法来获得子线程执行结束后的返回值
1 package thread; 2 3 import java.util.concurrent.ExecutionException; 4 import java.util.concurrent.FutureTask; 5 6 public class Main{ 7 public static void main(String[] args) { 8 FutureTask<Integer> ft = new FutureTask<>(new MyCallable()); 9 new Thread(ft).start(); 10 try { 11 System.out.println(ft.get()); 12 } catch (InterruptedException e) { 13 // TODO Auto-generated catch block 14 e.printStackTrace(); 15 } catch (ExecutionException e) { 16 // TODO Auto-generated catch block 17 e.printStackTrace(); 18 } 19 } 20 }
使用接口实现线程的好处:
多个线程可共享一个target对象,所以非常适合多个相同线程来处理同一份资源的情况,从而将CPU、代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想。