java 線程池和 隊列

一,隊列
實例:

package senior.queue;

import java.util.LinkedList;
import java.util.Queue;

/**
 * Created by Administrator on 2016/9/11.
 */
public class QueueTest {

    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<String>();
        queue.add("a"); //將指定的元素插入此隊列(如果立即可行且不會違反容量限制),在成功時返回 true,如果當前沒有可用的空間,則拋出 IllegalStateException。
        queue.add("b");
        queue.add("c");
        queue.offer("1"); //將指定的元素插入此隊列(如果立即可行且不會違反容量限制),當使用有容量限制的隊列時,此方法通常要優於 add(E),後者可能無法插入元素,而只是拋出一個異常。
        queue.offer("2");
        queue.offer("3");

        System.out.println("隊列:" + queue);
        System.out.println("隊列頭部:"+ queue.peek()); //查詢隊列頭部,如果隊列爲空,則返回null
        queue.poll(); //移除隊列頭部, 如果隊列爲空,則返回null
        System.out.println("移除隊列頭部後,隊列頭部:" + queue.peek());

    }

}

二,線程池
1,線程池的作用:
限制系統中執行線程的數量。
減少了創建和銷燬線程的次數,重複利用線程。
2,主要的類:
Executor:執行線程的接口
ExecutorSerivce: 線程池接口
ThreadPoolExecutor :線程池類
Executors:常用線程池工廠
3,常用的線程池
配置線程池是比較複雜的過程,所有可以使用現有的線程池工廠生成常用的線程池:
newCachedThreadPool:創建一個可根據需要創建新線程的線程池,但是在以前構造的線程可用時將重用它們,並在需要時使用提供的 ThreadFactory 創建新線程。
newSingleThreadExecutor:創建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。(注意,如果因爲在關閉前的執行期間出現失敗而終止了此單個線程,那麼如果需要,一個新線程將代替它執行後續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。與其他等效的 newFixedThreadPool(1) 不同,可保證無需重新配置此方法所返回的執行程序即可使用其他的線程。
newFixedThreadPool:創建一個可重用固定線程數的線程池,以共享的無界隊列方式來運行這些線程。在任意點,在大多數 nThreads 線程會處於處理任務的活動狀態。如果在所有線程處於活動狀態時提交附加任務,則在有可用線程之前,附加任務將在隊列中等待。如果在關閉前的執行期間由於失敗而導致任何線程終止,那麼一個新線程將代替它執行後續的任務(如果需要)。在某個線程被顯式地關閉之前,池中的線程將一直存在。
newScheduledThreadPool:創建一個線程池,它可安排在給定延遲後運行命令或者定期地執行。

4,實例:

package senior.threadtest;

import org.apache.poi.ss.formula.functions.T;

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

/**
 * Created by Administrator on 2016/9/11.
 */
public class Test {

    public static void main(String[] args) {
        long beginTime = System.currentTimeMillis();
        ExecutorService pool = Executors.newFixedThreadPool(8); //創建線程池
        Thread thread1 = new Thread(new ThreadTest());
        Thread thread2 = new Thread(new ThreadTest());
        Thread thread3 = new Thread(new ThreadTest());

        //執行線程
        pool.execute(thread1);
        pool.execute(thread2);
        pool.execute(thread3);


        long endTime = System.currentTimeMillis();

        System.out.println("主線程總共耗時: "+ (endTime - beginTime) + "毫秒");
    }

}
package senior.threadtest;

import test.LoggerInfo;

/**
 * Created by Administrator on 2016/9/11.
 */
public class ThreadTest extends LoggerInfo implements Runnable {

    @Override
    public void run() {
        try {
            Thread.sleep(3000);
            log.info(Thread.currentThread() + "執行完畢");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章