##一、通过继承Thread类实现多线程
在Java中负责线程的这个功能的是Java.lang.Thread这个类,可以通过创建Thread的实例来创建新的线程。每个线程都是通过某个特定Thread对象所对应的方法run()来完成其操作的,方法run()称为线程体。通过调用Thread类的start()方法来启动一个线程。
- 创建多线程:继承Thread类,重写 run(线程体)
public class Rabbit extends Thread{
@Override
public void run(){
for(int i = 0;i < 100;i++){
System.out.println("兔子跑了"+i+"步);
}
}
}
- 使用线程:创建子类对象,调用 对象.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);
}
具体实现方式:
- 类 实现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();
}
}