多线程之线程池

Posted currymds

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多线程之线程池相关的知识,希望对你有一定的参考价值。

(1)线程池的创建

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

/*
 * 线程池的好处:线程池里的每一个线程代码结束后,并不会死亡,而是再次回到线程池中成为空闲状态,等待下一个对象来使用。
 * 
 * 如何实现线程的代码呢?
 *         A:创建一个线程池对象,控制要创建几个线程对象。
 *             public static ExecutorService newFixedThreadPool(int nThreads)
 *         B:这种线程池的线程可以执行:
 *             可以执行Runnable对象或者Callable对象代表的线程
 *             做一个类实现Runnable接口。
 *         C:调用如下方法即可
 *             Future<?> submit(Runnable task)
 *            <T> Future<T> submit(Callable<T> task)
 *        D:我就要结束,可以吗?
 *            可以。
 */
public class ExecutorsDemo {
    public static void main(String[] args) {
        // 创建一个线程池对象,控制要创建几个线程对象。
        // public static ExecutorService newFixedThreadPool(int nThreads)
        ExecutorService pool = Executors.newFixedThreadPool(2);

        // 可以执行Runnable对象或者Callable对象代表的线程
        pool.submit(new MyRunnable());
        pool.submit(new MyRunnable());

        //结束线程池
        pool.shutdown();
    }
}


public class MyRunnable implements Runnable {

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

}

运行结果

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

(2)第二种方式实现线程池

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

/*
 * 多线程实现的方式3:
 *      A:创建一个线程池对象,控制要创建几个线程对象。
 *             public static ExecutorService newFixedThreadPool(int nThreads)
 *         B:这种线程池的线程可以执行:
 *             可以执行Runnable对象或者Callable对象代表的线程
 *             做一个类实现Runnable接口。
 *         C:调用如下方法即可
 *             Future<?> submit(Runnable task)
 *            <T> Future<T> submit(Callable<T> task)
 *        D:我就要结束,可以吗?
 *            可以。
 */
public class CallableDemo {
    public static void main(String[] args) {
        //创建线程池对象
        ExecutorService pool = Executors.newFixedThreadPool(2);
        
        //可以执行Runnable对象或者Callable对象代表的线程
        pool.submit(new MyCallable());
        pool.submit(new MyCallable());
        
        //结束
        pool.shutdown();
    }
}



import java.util.concurrent.Callable;

//Callable:是带泛型的接口。
//这里指定的泛型其实是call()方法的返回值类型。
public class MyCallable implements Callable {

    @Override
    public Object call() throws Exception {
        for (int x = 0; x < 100; x++) {
            System.out.println(Thread.currentThread().getName() + ":" + x);
        }
        return null;
    }

}

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

 (3)第三种接口Callable使用泛型的方式返回值

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

/*
 * 多线程实现的方式3:
 *      A:创建一个线程池对象,控制要创建几个线程对象。
 *             public static ExecutorService newFixedThreadPool(int nThreads)
 *         B:这种线程池的线程可以执行:
 *             可以执行Runnable对象或者Callable对象代表的线程
 *             做一个类实现Runnable接口。
 *         C:调用如下方法即可
 *             Future<?> submit(Runnable task)
 *            <T> Future<T> submit(Callable<T> task)
 *        D:我就要结束,可以吗?
 *            可以。
 */
public class CallableDemo {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        // 创建线程池对象
        ExecutorService pool = Executors.newFixedThreadPool(2);

        // 可以执行Runnable对象或者Callable对象代表的线程
        Future<Integer> f1 = pool.submit(new MyCallable(100));
        Future<Integer> f2 = pool.submit(new MyCallable(200));

        // V get()
        Integer i1 = f1.get();
        Integer i2 = f2.get();

        System.out.println(i1);
        System.out.println(i2);

        // 结束
        pool.shutdown();
    }
}

package cn.itcast_10;

import java.util.concurrent.Callable;

/*
 * 线程求和案例
 */
public class MyCallable implements Callable<Integer> {

    private int number;

    public MyCallable(int number) {
        this.number = number;
    }

    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int x = 1; x <= number; x++) {
            sum += x;
        }
        return sum;
    }

}

 



















以上是关于多线程之线程池的主要内容,如果未能解决你的问题,请参考以下文章

java多线程系类:JUC线程池:03之线程池原理(转)

Java多线程系列--“JUC线程池”04之 线程池原理

Android 多线程下载,断点续传,线程池

高并发多线程基础之ThreadPoolExecutor源代码分析

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

Java多线程系列--“JUC线程池”02之 线程池原理