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();
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章