实现并发最直接的方式是在操作系统级别使用进程。
并发任务彼此隔离的编程语言,被称为函数型语言,例如: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创建的线程属性(后台,优先级,名称):
分享到:
相关推荐
《Go学习笔记第四版》是一本深度探讨Go语言的书籍,专为想要深入理解Go语言特性和实战应用的读者设计。Go语言,又称Golang,是Google在2009年发布的一种静态类型、编译型、并发型且具有垃圾回收功能的编程语言。其...
### Java私塾学习笔记整理 #### 第一章:Java入门 **一、Java是什么?** Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年推出。它旨在为跨平台开发提供一种通用的语言环境,使开发者能够在任何...
《王者归来之Thinking in Java读书笔记》是对Bruce Eckel的经典之作《Thinking in Java》第四版的深度学习与总结。这本书是Java程序员的必备参考书,它深入浅出地阐述了Java语言的核心概念和技术,旨在帮助读者理解...
- Java作为一种广泛使用的编程语言,其学习路径包括掌握基本语法、理解面向对象编程思想、熟悉标准库使用等。 - **JAVA发展概述** - Java的发展历程:从1995年由Sun Microsystems公司发布以来,Java经历了多次重大...
本资源包含了这本书第四版的学习笔记和源代码,旨在帮助读者更好地理解和掌握Java编程思想。以下是对这些知识点的详细阐述: 1. **面向对象编程(OOP)**:Java是一种纯面向对象的语言,它强调类、对象、封装、继承...
【Java SE课程笔记详解】 Java SE(Standard Edition)是Java平台的核心版本,它为开发桌面应用、服务器端...通过深入学习和实践,你可以扎实掌握Java编程基础,为进一步深入学习Java EE或Android开发打下坚实的基础。
- **《Java编程思想》** 是一本经典的 Java 编程书籍,适合所有水平的开发者阅读。 - **《Java核心技术卷1原书第8版》** 提供了最新的 Java 技术介绍,对于想要了解 Java 最新特性的开发者来说是非常宝贵的资源。 ...
oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 第一章 Oracle入门 一、 数据库概述 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今五十年前。简单来说是本身可视...