Executors.newCachedThreadPool() //创建一个无边界的线程池 Executors.newFixedThreadPool(int) //创建一个有边界的线程池 Executors.newSingleThreadExecutor() //创建单一线程池二、ThreadPoolExecutor的使用
运行存在的情况构造方法:ThreadPoolExecutor(int corePoolSize,int MaximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueueworkQueue)
(1) if A<=B 直接创建线程,不放到扩展队列Queue中。 (2) if A>B&&A<=C&&E C和G参数被不起作用,D会被放在E中等待,不会立即创建线程,会等待核心线程空闲出来。 (3) if A>B&&A<=C&&F C和G起作用,会马上创建线程运行,创建后的线程活跃时间到了,就会销毁,只留下核心线程 (4) if A>B&&A> C&&E C和G参数被不起作用,D会被放在E中等待,不会立即创建线程,会等待核心线程空闲出来。 (5) if A>B&&A> C&&F C和G起作用,处理C的任务,其他任务不再创建抛出异常停止线程池的函数
三、并发集合框架shutdown()与shutdownNow()
shutdown()的作用是在关闭时会执行未执行完的线程
shutdownNow()会中断所有的任务
线程不安全的集合
1.List集合是非线程安全的 2.Vector是线程安全的链表 3.HashSet是线程不安全的 4.Queue队列 Deque双端队列
线程安全的集合
非阻塞队列 Hashtable --->代替hashMap 不支持使用iterator是改变其结构 ConcurrentHashMap ---> 支持使用iterator是改变其结构,不支持排序 ConcurrentSkipListMap --->支持排序 ConcurrentSkipListSet ConcurrentlinkedQueue ConcurrentlinkedDeque CopyOnWriteArrayList CopyOnWriteArraySet
阻塞队列 AarryBlockingQueue 有界阻塞队列 PriorityBlockingQueue 支持并发情况下的优先级队列 SynchronousQueue 异步阻塞队列,每个插入操作必须等待另一个线程对应的移除操作,经常在多线程中传输数据时使用四、Futrue与Callable的使用 使用方法
使用get()结合ExecutorService中的submit(Callable五、CompletionService的使用)来使用,部分代码如下: ThreadPoolExecutor executor = new ThreadPoolExecutor(2,3,5L,TimeUnit.SECONDS,new linkedBlockingDeque()); Future future = executor.submit(callable); future.get(); //获取线程运行得到的数据 它如果得不到数据就会阻塞在这里 future.get(long timeout,TimeUnit unit) //设置最大等待时间 ExecutorService中submit(Runnable,T result),第二个参数result可以作为执行结果的返回值,而不需要使用get()方法进行获得
部分代码它的功能是以异步的方式一边生成新的任务,一边处理已完成任务的结果,这个可以将执行任务与处理任务分离开来进行处理。使用submit执行任务,使用take取得已处理的任务,并按照完成执行任务的时间顺序处理他们的结果
MyCallable callable1 = new MyCallable(....); MyCallable callable2 = new MyCallable(....); MyCallable callable3 = new MyCallable(....); MyCallable callable4 = new MyCallable(....); MyCallable callable5 = new MyCallable(....); List代码性能callableList = new ArrayList (); callableList.add(callable1); callableList.add(callable2); callableList.add(callable3); callableList.add(callable4); callableList.add(callable5); ThreadPoolExecutor executor = new ThreadPoolExecutor(5,10,5L,TimeUnit.SECONDS,new linkedBlockingDeque()); CompletionService scRef = new ExecutorCompletionService(executor); for(int i = 0;i < 5; i++){ scRef.submit(callableList,get(i)); } for(int i = 0; i<5; i++){ System.out.println(csRef.take().get()); }
使用了CompletionService后,那个任务先执行完,就先打印那个任务的结果。 如果当前没有任务被执行完,则scRef.take().get()方法还是呈阻塞态六、Semaphore与CountDownLatch、CyclicBarrier和Phaser的使用
都是对synchronized的升级,可以控制线程并发数



