实现并发最直接的方式是在操作系统级别使用进程。
并发任务彼此隔离的编程语言,被称为函数型语言,例如:erlang。
Java的线程机制是抢占式的,这表示调度机制会周期性地中断线程,将上下文切换到另一个线程,从而为每个线程都提供时间片,使得每个线程都会分配到数量合理的时间去驱动它的任务。(协作多线程)
线程的底层机制:切分CUP时间,但通常你不需要考虑它。
使用线程机制是一种建立透明的,可扩展的程序的方法。
Thread.yield()的调用是对线程调度器的一种建议,它表明“我已经执行完全生命周期中最重要的部分,此刻正是切换给其他任务执行一段时间的大好时机。
main()创建Thread对象时,每个Thread都”注册“了自己,它的任务退出其run()并死亡之前,垃圾回收器无法清除它。一个线程会创建一个单独的执行线程,在对start()的调用完成之后,它仍会继续存在。
使用Executor(java.util.concurrent包),用于管理Thread对象,为客户端和任务执行之间提供一个间接层,由Executor这个中介对象负责执行任务。允许你管理异步任务的执行。
ExecutorService(具有服务生命周期的Executor)知道如何构建恰当的上下文来执行Runnable对象。
ExecutorService service = Executors.newCachedThreadPool();//or newFixedThreadPool(5_
for(int i = 0; i < 5; i++){
service.execute(new LiftOff());
}
service.shutdown();
创建Executor的线程(这里是main线程)会继续运行,直至Executor的shutdown()方法调用后,这个线程(main)将在Executor中所有任务完成之后尽快退出。
在任何线程池中,现有线程在可能的情况下,都会被自动复用。
SingleThreadExecutor:对于想在另一个线程中连续运行的任何事物来说,是很有用的。例如监听进入的套接字连接的任务,或希望在线程中运行的短任务(如更新本地或远程日志的小任务)。
从任务中产生返回值:Callable接口。它的类型参数表示是从方法call()中返回值,并且必须使用ExecutorService.submit()方法调用它,示例:
public class CallableDemo {
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
List<Future<String>> list = new ArrayList<Future<String>>();
for(int i =0; i < 5; i++){
list.add(service.submit(new TaskWithResult(i)));
}
for(Future<String> future : list){
try{
//get() blocks until completion:
System.out.println(future.get());
}catch(Exception e){
e.printStackTrace();
}finally{
service.shutdown();
}
}
}
}
class TaskWithResult implements Callable<String> {
private int id;
public TaskWithResult(int id) {
this.id = id;
}
@Override
public String call() throws Exception {
return "result of TaskWithResult " + id;
}
}
异常是不能跨线程传播回main(),必须在本地处理所有任务内部产生的异常。
优先级将该线程的重要性传递给了调度器。优先级较低的线程仅仅是执行的频率较低。试图通过设置优先级来调试线程运行顺序是不可靠的。
让步:yield(),让别的线程使用CPU。这只是一个暗示,没有任何机制保证它将会被采纳。
后台线程:指在程序运行的时候在后台提供一种通用服务的线程,并不属于程序中必要的部分。因此当非后台进程结束时,程序也会终止,同时会杀死进程中的所有后台线程。反过来,只要有非后台线程还在运行,程序就不会终止(如main是非后台线程)。
可以通过实现ThreadFactory来定制Executor创建的线程属性(后台,优先级,名称):
分享到:
相关推荐
《Java编程思想》是 Bruce Eckel 的经典著作,第四版更是深入浅出地介绍了Java语言的核心概念和技术。这个压缩包包含的源代码是书中的示例程序,它们旨在帮助读者理解书中阐述的各种编程原理和实践。通过分析这些源...
Java并发编程是Java开发中必不可少的一部分,涉及到多线程、同步机制、线程池以及并发工具类等多个核心知识点。以下是对这些主题的详细说明: 1. **线程安全与锁 Synchronized 底层实现原理**: 线程安全是指在多...
《Java编程思想》是Bruce Eckel的经典之作,第四版更是被广大Java开发者视为学习和进阶的必备书籍。这本书深入浅出地介绍了Java语言的核心概念和技术,包括面向对象编程、异常处理、多线程、集合框架、网络编程等多...
这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的区别** - **线程** 是程序执行的最小单位,一个进程中可以有多个线程同时执行,共享同一块内存空间,通信...
综上,这本《Think in JAVA 编程思想》第四版涵盖了Java语言的各个方面,无论你是初学者还是经验丰富的开发者,都能从中受益。通过学习和实践书中的知识点,将有助于提升你的编程能力和问题解决能力。
《Java编程思想第四版》是一本深受欢迎的Java学习书籍,尤其适合已经具备一定编程基础的程序员进行进阶学习。作者Bruce Eckel以其独特的视角和深入浅出的讲解方式,全面而系统地介绍了Java编程语言的核心概念和技术...
### Java并发编程学习笔记知识点详解 #### 一、Java并发编程概述 Java并发编程是指在Java应用程序中同时执行多个操作的技术。它通过多线程、线程池等机制实现资源的有效利用,提高程序运行效率。Java并发编程的...
根据提供的文件信息,我们可以推断出这是一份关于《Java编程思想》第四版一书的课后练习答案指南。此书由Bruce Eckel撰写,并由MindView, Inc.出版。以下是从该文件的标题、描述及部分内容中提取的关键知识点。 ###...
通过学习《Java并发编程实战》的源码,你可以更直观地了解这些概念如何在实际代码中实现,从而提升你的并发编程能力。在IDE中运行这些示例,可以加深对并发原理的理解,同时也能锻炼解决问题的能力。记住,实践是...
总的来说,《Java网络编程(第四版)》是一本全面而实用的教程,适合有一定Java基础的开发者学习。它不仅涵盖了网络编程的基础知识,也深入到高级特性和实践技巧,对于想要提升网络编程能力的Java程序员来说,是一本...
此外,该书可能会对Java中一些新的并发API进行探讨,如java.util.concurrent包下的工具类和接口,例如Executor框架、Future、CompletableFuture、ConcurrentHashMap、Semaphore等。这些工具类和接口在构建大规模并发...
在Java中,这通常通过创建和管理线程来实现。 2. **Java并发工具** - **`java.util.concurrent` 包** 提供了丰富的并发工具类,如`ExecutorService`用于管理线程池,`Semaphore`用于许可证管理,`CountDownLatch`...
Java并发编程学习笔记,...目前,在JAVA并发编程方面的论述系统且内容详实的技术资料不太多,Java并发编程学习笔记是作者在实际工作中的经验总结,一般来说,当你读完了前8章,你已经足以可以应对JAVA的多线程编程了。
书中详细讨论了Java中的线程管理,包括如何创建和启动线程,以及如何控制线程的生命周期。读者将学习到`Thread`类和`Runnable`接口的基本用法,以及如何通过实现`Callable`接口创建带返回值的线程。 锁是Java并发...
JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...
综上所述,《Java并发编程实战》不仅涵盖了Java并发编程的基础知识和技术细节,还包含了丰富的实践经验和前瞻性的思考,是任何一位从事Java开发工作的程序员不可或缺的学习资源。无论是初学者还是有经验的开发者都能...
通过深入学习《JAVA并发编程艺术》,开发者能更好地理解并发编程的原理,熟练运用Java提供的并发工具和API,解决实际开发中的多线程问题,提高软件的性能和稳定性。这是一本值得每一位Java开发者研读的书。