Lock&Condition
Executor
任务执行器,通过线程池来完成任务的执行。
使用线程池的好处:
仅需维护一定数量的线程去执行任务,降低频繁创建或销毁线程而带来的性能损耗。
interface ExecutorService extends Executor
interface ScheduledExecutorService extends ExecutorService
Executor 属于顶层接口,仅提供了一个执行线程任务的方法
void execute(Runnable command);
ExecutorService 接口则定义了更多适用的方法
<T> Future<T> submit(Callable<T> task);
<T> Future<T> submit(Runnable task, T result);
<T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks);//批量任务
创建线程池,使用Executors
//1.单一线程
ExecutorService executor = Executors.newSingleThreadExecutor();
//2.可无限创建新线程,一般用于请求多但处理时间短的情况
ExecutorService executor = Executors.newCachedThreadPool();
//3.固定线程数量的线程池
ExecutorService executor = Executors.newFixedThreadPool(nThreads);
//4. 按指定频率执行任务的线程池
ScheduledExecutorService service = Executors.newScheduledThreadPool(corePoolSize);
扩展:
手动配置线程池的参数
ExecutorService executor = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
Callable & Future 的用法
package org.thread; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadLocalRandom; public class App { ExecutorService executor = Executors.newSingleThreadExecutor(); ArchiveSearcher searcher = new ArchiveSearcher(); void showSearch(final String target) throws InterruptedException { //提交任务1到线程池中执行 Future<String> future = executor.submit(new Callable<String>() { @Override public String call() throws Exception { return searcher.search(target); } }); //任务2由当前线程负责执行 displayOtherThings(); //当任务2执行完成后,当前线程尝试获取任务1的执行结果 try { disPlayText(future.get()); executor.shutdown(); } catch (ExecutionException e) { e.printStackTrace(); cleanup(); return; } } private void cleanup() { executor.shutdownNow(); } private void disPlayText(String text) { System.out.println("Result from future is :" + text); } private void displayOtherThings() { for(int i=0;i<10;i++) { System.out.println(Thread.currentThread().getName() + "..." + i); } } public static void main(String[] args) throws InterruptedException { new App().showSearch("UFO"); } } class ArchiveSearcher { public String search(String target) { int mills = ThreadLocalRandom.current().nextInt(10000); System.out.format(Thread.currentThread().getName() + " sleep %s ms%n", mills); try { Thread.sleep(mills); } catch (InterruptedException e) {} return "Hello Callable & Future! The target is: " + target; } }
任务调度
package schedulePool; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ThreadScheduledTest { /** * 线程调度中,同一时间段内只能有1个任务被调度. * 如果前面的任务抛出了异常,后面的调度将不会再执行! */ public static void main(String[] args) throws Exception { ScheduledExecutorService executor = Executors.newScheduledThreadPool(5); System.out.println("start at: "+System.currentTimeMillis()); /** * AtFixedRate调度的基本规则: * initialDelay之后开启第1个任务的调度 * 第二个调度:initialDelay+period, * then initialDelay + 2 * period, * ... * 需要注意的是: * 前一个任务执行所需时间大于period值时,Executor不会按period值调度下一个任务, * 而是等到前一个任务完成之后立即开始调度下一个任务 * 但,一般情况下线程调度的执行周期都是比较长的值,如1天执行1次 */ executor.scheduleAtFixedRate(new Runnable() { @Override public void run() { long current = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName()+": " + current); try { Thread.sleep(4000); } catch (InterruptedException e) {} System.out.println(Thread.currentThread().getName()+": " + "Done "+System.currentTimeMillis()); } }, 2, 3, TimeUnit.SECONDS); /** * 以上一个任务完成的时间为计算基准,在此基础上延迟若干秒后才开始新的调度 * 前一个任务完成后 + delay ===> 开始调度下一个任务 */ executor.scheduleWithFixedDelay(new Runnable() { @Override public void run() { long current = System.currentTimeMillis(); System.out.println(Thread.currentThread().getName()+": " + current); try { Thread.sleep(1000); } catch (InterruptedException e) {} System.out.println(Thread.currentThread().getName()+": " + "Done "+System.currentTimeMillis()); } }, 2, 3, TimeUnit.SECONDS); } }
并发集合
java.util.concurrent提供了一些集合框架的辅助类
BlockingQueue 任务列队
ArrayBlockingQueue LinkedBlockingQueue
ConcurrentMap
HashMap的并发模式:ConcurrentHashMap
TreeMap的并发模式:ConcurrentSkipListMap
对这些集合中的元素进行操作,会发生happens-before关系,能够有效避免内存一致性错误。
原子操作
class Sequencer { private final AtomicLong sequenceNumber = new AtomicLong(0); public long next() { return sequenceNumber.getAndIncrement(); } }
相关推荐
WEB API 多线程并发测试工具; WEB API 多线程并发测试工具
java线程与并发实践编程 /美(jeff Friesen) 2017.2 java线程api和并发工具的实用指南
编写一个程序,完成多个...通过本实验,学习在Win32程序中利用操作系统提供的API创建线程,并通过所创建线程的运行情况来获得关于多线程并发的感性认识,以及加深对临界资源(本实验中临界资源是屏幕)互斥访问的理解。
本书全面解析了Java并发编程的核心概念、原理和实践,帮助读者深入理解多线程并发编程的精髓,提升编程能力和系统性能。 书中首先介绍了并发编程的基础知识,包括线程的基本概念、线程的生命周期、线程安全等问题。...
Socket 接口是TCP/IP 网络最为通用的应用接口,也是在Internet 上进行网络程序应用开发最通用的API[1],本文介绍了Socket通信的基本机制以及采用多线程技术实现并发通信的基本原理,并给出实例。
《C++面向对象多线程编程》推荐:毫无疑问,这是我见过的最好的、最全面的多线程方面的图书。如果你把自己看作一位程序员,而不是组件装配员,那你就需要了解多线程方面的知识。只要不是刚刚入门的C++程序员都可以从...
通过C/C++高并发服务器api,涵盖线程,进程管理,信号量,消息队列等api,可通过不同业务需求,编写服务器框架。
本文主要总结了Java并发开发中常见的基础API的使用,以及他们之间区别
线程的相关信息,
常见的多线程API和用法 pthread_self函数 pthread_create函数 pthread_exit函数 pthread_join函数 pthread_detach函数 pthread_equal函数
多线程基础理论, 多线程中常用API,多线程的实现方式, 线程池以及创建线程池相关API, 常见的设计模式等内容
本书是一本通俗易懂的C#多线程编程指南,通过70多个容易理解的示例,循序渐进地讲解C#5.0中的异步及并发编程,引导读者了解Windows下C#多线程编程的多样性。 通过阅读本书,你将学到: 使用原始线程、异步线程,...
如果用Windows API来创建线程的话,是通过一个叫做CreateThread的API函数来实现的,它的定义为: HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize, LPTHREAD_...
课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类,分布式锁原理与实现方式,并发编程-AQS等等针对性非常强的JAVA编程开发教程,这其中的内容对JAVA开发技能的拔尖,非常的有帮助。...
《JAVA并发编程实践》并不仅仅提供并发API的清单及其机制,还提供了设计原则、模式和思想模型,使我们能够更好地构建正确的、性能良好的并发程序。《JAVA并发编程实践》适合于具有一定Java编程经验的程序员、希望...
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
首先,先了解下 php中的curl多线程函数:复制代码 代码如下:# curl_multi_add_handle# curl_multi_close# curl_multi_exec# curl_multi_getcontent# curl_multi_info_read# curl_multi_init# curl_multi_remove_...
Executor框架是Java并发编程中的一个重要工具,它提供了一种管理线程池的方式,使得我们可以更方便地管理线程的生命周期和执行线程任务。 原子操作是指不可被中断的操作,要么全部执行成功,要么全部不执行。原子...
│ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力结束线程的综合实战.mp4 │ 高并发编程第一阶段18讲、数据同步的引入与Synchronized的简单介绍.mp4 │ 高并发编程第一阶段19讲、结合...
课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类,分布式锁原理与实现方式,并发编程-AQS等等针对性非常强的JAVA编程开发教程,这其中的内容对JAVA开发技能的拔尖,非常的有帮助。...