线程创建的四种方式

1 . 继承Thread类创建线程

  1. 定义Thread类的子类,并重写该类的run() 方法,该方法的方法体就是线程需要完成的任务,run()方法也称为线程的执行体
  2. 创建Thread子类的实例,也就是创建了线程对象
  3. 启动线程,及调用线程的start()方法
public class MyThread extends Thread{	
	public void run(){
		//重写run方法
	}
}
public class Main{
	public static void main(String[] args){
		//创建并开启线程
		new MyThread().start();
	}
}

2 . 实现Runnable接口创建线程

  1. 定义Runnable接口的实现类,重写run()方法,这个run()方法和Thread中的run()方法一样是线程的执行体
  2. 创建Runnable实现类的实例,并用这个实例作为Thread的target来创建Thread对象,这个Thread对象才是真正的线程对象
  3. 通过调用线程对象的start()方法来启动线程
//实现Runnable接口
public class MyThread implements Runnable{
	public void run(){
		//重写run()方法
	}
)
public class Main{
	public static void main(String[] args){
		//创建并启动线程
		MyThread myThread = new MyThread();
		Thread thread = new Thread(myThread);
		thread().start();
		//或者 new Thread(new MyThread()).start();
	}
}

3 . 使用Callable 和 Future创建线程

  1. 创建Callable接口的实现类,并实现call()方法,然后创建该实现类的实例(从java8开始可以直接使用Lambda表达式创建Callable对象)
  2. 使用FutureTask类来包装Callable对象,该FutureTask对象封装了Callable对象的call()方法的返回值
  3. 使用FutureTask对象作为Thread对象的target创建并启动线程(因为FutureTask实现了Runnable接口)
  4. 调用FutureTask对象的get()方法来获取子线程执行结束后的返回值
public class Main{
	public static void main(String[] args){
		MyThread th = new MyThread();
		//使用Lanbda表达式创建Callable对象
		//使用FutureTask类来包装Callable对象
		FutureTask<Integer> future = new FutureTask<Integer>
			((Callable<Integer>)()->{
				return 5;
				}
			);
		//实质上还是以Callable对象来创建并启动线程
		new Thread(task,"有返回值的线程").start();
		try{
			//get()方法会阻塞,直到子线程执行结束才返回
			System.out.println("子线程的返回值:"+future.get());
		}catch(Exception e){
			ex.printStackTrace();
		}
	}
}

4 . 使用线程池例如用Executor框架

Executor框架包括:线程池 , Executor , Executors , ExecutorService , CompletionService , Future , Callable 等.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值