首页 > 代码库 > 多线程的几种实现方式

多线程的几种实现方式

 

JAVA多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。

继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例,并且,启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。这种方式实现多线程很简单,通过自己的类直接extend Thread,并复写run()方法,就可以启动新线程并执行自己定义的run()方法。

public class ThreadTest extends Thread {

  private int index;  

  public ThreadTest(int index){
  this.index = index
};  
  public void run() {    System.out.println("ThreadTest"+index);   } };

可以做一个测试类来进行测试
for(i = 0;i<=3;i++){
  ThreadTest threadTest = new ThreadTest(i);
  threadTest.start();
}

正常会返回这样的结果
ThreadTest0
ThreadTest1
ThreadTest2
ThreadTest3
2、实现Runnable接口方式实现多线程
这种实现方式主要是为了应对线程类已经继承了一个父类,因此无法再进行继承Thread的情况。
public class ThreadTest extends OtherClass implements Runnable {
  private int index;  

  public ThreadTest(int index){
  this.index = index
}; 
public void run() {
   System.out.println("ThreadTest"+index);
  }
};
它的启动方式和直接继承Thread类的方式有些许不同,需要首先实例化一个
ThreadTest类,再以此实例作为参数对Thread类进行构造。再启动Thread类
的start()方法
for(int i=0;i<=3;i++){
  ThreadTest threadTest = new ThreadTest(i);
  Thread thread = new Thread(threadTest);
  thread.start();
}
正常会返回这样的结果
ThreadTest0

ThreadTest1
ThreadTest2

ThreadTest3
3、使用ExecutorService实现
 int taskSize = 5;
   // 创建一个线程池
ExecutorService pool = Executors.newFixedThreadPool(taskSize);
//线程实例可以复用以上的实例
for(int i=0;i<=3;i++){
  ThreadTest threadTest = new ThreadTest(i);
pool.subbmit(threadTest);
}

上述代码中Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口。
public static ExecutorService newFixedThreadPool(int nThreads) 
创建固定数目线程的线程池。
public static ExecutorService newCachedThreadPool() 
创建一个可缓存的线程池,调用execute 将重用以前构造的线程(如果线程可用)。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
public static ExecutorService newSingleThreadExecutor() 
创建一个单线程化的Executor。
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) 
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

如果ExecutoreService中的线程类实现的是Callable接口,则最后线程走完之后会返回一个Future。这个Future其实就是线程结束时的返回值。

 

多线程的几种实现方式