多线程的几种实现方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程的几种实现方式相关的知识,希望对你有一定的参考价值。
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其实就是线程结束时的返回值。
以上是关于多线程的几种实现方式的主要内容,如果未能解决你的问题,请参考以下文章