Java实现多线程的三种方式

##一、通过继承Thread类实现多线程
在Java中负责线程的这个功能的是Java.lang.Thread这个类,可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。

  1. 创建多线程:继承Thread类,重写 run(线程体)
public class Rabbit extends Thread{
	@Override
	public void run(){
		for(int i = 0;i < 100;i++){
			System.out.println("兔子跑了"+i+"步);
		}
	}
}
  1. 使用线程:创建子类对象,调用 对象.start(); -->线程启动
public class RabbitApp{
	public static void main(String[] args){
		//创建子类对象
		Rabbit rab = new Rabbit();
		//调用start方法
		rab.start();
	}
}

##二、通过Runnable接口实现多线程
继承Thread类实现多线程,如果我们的类已经从一个类继承,则无法再继承Thread类。通过Runnable接口实现多线程,可以同时实现继承,避免单继承的局限性,方便共享资源。
这种方式实现多线程,其实是用了静态代理设计模式。Java.lang.Thread已经实现了Runnable接口,其实Thread类就相当于一个代理角色,我们只需要创建一个自己的真实角色,后期内容交给Thread管理。
代理模式中,需要将真实角色类交给代理类,我们在Thread的源码中可以看到Thread有个构造函数用来接收目标类。

    public Thread(Runnable target) {
        init(null, target, "Thread-" + nextThreadNum(), 0);
    }

具体实现方式:

  1. 类 实现Runnable接口,重写run() -->真实角色类
public class Programmer implements Runnable{
	@Override
	public void run(){
		for(int i = 0;i<1000;i++){
			System.out.println("Hello World...");
		}
	}
}

2.启动多线程,使用静态代理

  • 创建真实角色
  • 创建代理角色 + 真实角色引用
  • 调用 .start() 启动线程
public class ProgrammerApp{
	public static void main(String[] args){
		//创建真实角色
		Programmer pro = new Programmer();
		//创建代理角色  真实角色引用
		Thread proxy = new Thread(pro);
		//调用 .start() 启动线程
		proxy.start();
	}
}

##三、通过Callable接口实现多线程
Callable是类似于Runnable接口,实现Callable接口的类和实现Runnable的类都是可以被其它线程执行的任务。

Callable和Runnable有几点不同:

  • Callable规定的方法是call(),而Runnable规定的方法是run()
  • call()方法可以抛出异常,而run()方法是不能抛出异常的
  • Callable的任务指定后可返回值,运行Callable任务可拿到一个Future对象,而Runnable的任务是不能返回值的。

Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果。

通过Callable接口实现多线程优点是可以获取返回值,缺点是比较繁琐。

####· 实现思路
1.创建Callable实现类,重写call()
2.借助 执行调度服务ExecutorService,获取Future对象

ExecutorService ser = Executors.newFixedThreadPool(2);
Future result = ser.submit(实现类对象);

3.获取值result.get()
4. 停止服务 ser.shutdownNow();
####· 实现代码

class Race implements Callable<Integer>{
	@Override
	public Integer call() throws Exception{
		return 1000;
	}
}

//----
class Call{
	public static void main(String[] args) throws Exception{
		//创建线程
		ExecutorService ser = Executors.newFixedThreadPool(1);
		Race tortoise = new Race();
		//获取值
		Future<Integer> result = ser.submit(tortoise);
		int num = result.get();
		System.out.println(num);
		//停止服务
		ser.shutdownNow();
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值