一、创建线程的第一种方式:
继承Thread ,由子类复写run方法。
步骤:
1,定义类继承Thread类;
2,目的是复写run方法,将要让线程运行的代码都存储到run方法中;
3,通过创建Thread类的子类对象,创建线程对象;
4,调用线程的start方法,开启线程,并执行run方法。
public class ThreadDemo extends Thread{ @Override public void run() { System.out.println("====thread====="); } public static void main(String[] args) { ThreadDemo threadTest1=new ThreadDemo(); threadTest1.start(); } }
二、创建线程的第二种方式:
实现一个接口Runnable。
步骤:
1,定义类实现Runnable接口。
2,覆盖接口中的run方法(用于封装线程要运行的代码)。
3,通过Thread类创建线程对象;
4,将实现了Runnable接口的子类对象作为实际参数传递给Thread类中的构造函数。
为什么要传递呢?因为要让线程对象明确要运行的run方法所属的对象。
5,调用Thread对象的start方法。开启线程,并运行Runnable接口子类中的run方法。
public class RunableTest{ public static void main(String[] args) { Thread thread=new Thread(new RunableDemo()); thread.start(); } } class RunableDemo implements Runnable{ @Override public void run() { System.out.println("======runnable======="); } }
三、创建线程的第三种方式:
实现一个接口Callable。
步骤:
1,定义类实现Callable接口。
2,覆盖接口中的call方法(用于封装线程要运行的代码)。
3,通过FutureTask来创建对象,用于接收运算结果;
4,将实现了Callable接口的子类对象作为实际参数传递给FutureTask类中的构造函数;
5,通过Thread类创建线程对象;
6,将FutureTask对象作为实际参数传递给Thread类中的构造函数;
7,调用Thread对象的start方法。开启线程,并运行Callable接口子类中的call方法;
8,通过Future对象的get方法获取结果。
/** * 1、创建线程式三:实现Callable接口。相较于Runnable接口的方式,方法可以有返回值,并且可以抛出异常。 2、执行Callable方式,需要FutureTask实现类的支持,用于接收运算结果。FutureTask是RunnableFuture接口的实现类, RunnableFuture接口继承了Runnable, Future接口 3.FutereTask也可用于闭锁操作 */ public class CallableTest { public static void main(String[] args) throws ExecutionException, InterruptedException { CallableDemo cd=new CallableDemo(); FutureTask<Integer> ft1=new FutureTask(cd); new Thread(ft1,"线程a").start(); //如果想再起一个线程,得重新创建一个newFutureTask,不然线程不会执行。 FutureTask<Integer> ft2=new FutureTask(cd); new Thread(ft2,"线程b").start(); int number=200; System.out.println("----------------"); //如果做计算,建议放最下面,避免阻塞 //要求获得Callable线程的计算结果,如果没有计算完成就会阻塞,直到计算完成 Integer sum1=ft1.get(); Integer sum2=ft2.get(); System.out.println("线程a===="+sum1); System.out.println("线程b===="+sum2); System.out.println("线程a+num:"+(sum1+number)); } } class CallableDemo implements Callable<Integer> { @Override public Integer call() throws Exception { System.out.println(Thread.currentThread().getName()+" 进入Callable"); int sum=0; for(int i=0;i<=100;i++){ sum+=i; } return sum; } }
四、创建线程的第四种方式:线程池