一、创建线程的第一种方式:
继承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;
}
}
四、创建线程的第四种方式:线程池