如何使用java语言实现一个线程池,不使用jdk自带的线程池

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用java语言实现一个线程池,不使用jdk自带的线程池相关的知识,希望对你有一定的参考价值。

参考技术A import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test

public static void main(String[] args) throws InterruptedException

ExecutorService exe = Executors.newFixedThreadPool(5);
for (int i = 1; i <= 50; i++)

exe.execute(new SubThread(i));

System.out.println("shutdown");
exe.shutdown();
while (true)

if (exe.isTerminated())

System.out.println("结束了!");
break;

Thread.sleep(200);




public class SubThread extends Thread

private final int i;

public SubThread(int i)

this.i = i;


@Override
public void run()

System.out.println(i);
try

Thread.sleep(2000);
catch (InterruptedException e)

e.printStackTrace();


线程池

程序启动一个新线程成本是比较高的,因为它涉及到要与操作系统进行交互。而使用线 程池可以很好的提高性能,尤其是当程序中要创建大量生存期很短的线程时,更应该考虑使 用线程池。

线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态, 等待下一个对象来使用。

在JDK5 之前,我们必须手动实现自己的线程池,从JDK5 开始,Java 内置支持线程池 JDK5 新增了一个Executors 工厂类来产生线程池,有如下几个方法

  public static ExecutorService newCachedThreadPool()

  public static ExecutorService newFixedThreadPool(int nThreads)

  public static ExecutorService newSingleThreadExecutor()

这些方法的返回值是ExecutorService 对象,该对象表示一个线程池,可以执行Runnable 对象或者Callable 对象代表的线程。它提供了如下方法

  Future<?> submit(Runnable task)
  <T> Future<T> submit(Callable<T> task)

案例演示
  创建线程池对象
  创建Runnable 实例
  提交Runnable 实例线程池的好处:线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。

如何实现线程的代码呢?
A:创建一个线程池对象,控制要创建几个线程对象。
  public static ExecutorService newFixedThreadPool(int nThreads)

B:这种线程池的线程可以执行:
  可以执行Runnable 对象或者Callable 对象代表的线程
  做一个类实现Runnable 接口。
C:调用如下方法即可
  Future<?> submit(Runnable task)
  <T> Future<T> submit(Callable<T> task)
D:我就要结束线程池,可以吗?
  可以。shutdown()

package com.test;

public class MyRunnable implements Runnable {

    @Override
    public void run() {
        for(int x=0;x<10;x++){
            System.out.println(Thread.currentThread().getName()+":"+x);
        }
    }

}
package com.test;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ExecutorsTest {

    public static void main(String[] args) {
        // 创建一个线程池对象,控制要创建几个线程对象。
        ExecutorService pool = Executors.newFixedThreadPool(2);
        // 可以执行Runnable 对象或者Callable 对象代表的线程
        pool.submit(new MyRunnable());
        pool.submit(new MyRunnable());
        //结束线程池
        pool.shutdown();
    }

}

 运行结果:

pool-1-thread-2:0
pool-1-thread-2:1
pool-1-thread-2:2
pool-1-thread-2:3
pool-1-thread-2:4
pool-1-thread-2:5
pool-1-thread-2:6
pool-1-thread-2:7
pool-1-thread-2:8
pool-1-thread-2:9
pool-1-thread-1:0
pool-1-thread-1:1
pool-1-thread-1:2
pool-1-thread-1:3
pool-1-thread-1:4
pool-1-thread-1:5
pool-1-thread-1:6
pool-1-thread-1:7
pool-1-thread-1:8
pool-1-thread-1:9

 














以上是关于如何使用java语言实现一个线程池,不使用jdk自带的线程池的主要内容,如果未能解决你的问题,请参考以下文章

如何优雅的自定义 ThreadPoolExecutor 线程池

Java并发多线程编程——线程池

优雅的自定义 ThreadPoolExecutor 线程池

JAVA线程池配置及使用注意事项

JDK 线程池源码实现解析

阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第5节 线程池_2_线程池的代码实现