1. 程式人生 > >多線程之線程池

多線程之線程池

tor 創建線程 運行 類型 args ber str except .get

(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;
    }

}

多線程之線程池