java线程

本文深入解析进程与线程的区别与联系,阐述了进程的独立性、动态性和并发性特征,详细对比了进程和线程在地址空间、资源拥有等方面的差异。进一步介绍了线程的创建方式,包括继承Thread、实现Runnable、使用Callable和Future等方法,并详细解释了ExecutorService线程池的工作原理和ThreadPoolExecutor类的参数介绍。文章最后探讨了线程池的使用场景和拒绝任务处理策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

备注:温故而知新

什么是进程

进程是处于运行中的程序,并且具有一定的独立功能,是系统进行资源分配和调度的一个独立单位

一般而言,进程包含以下3个特征:

  • 独立性:进程是系统中独立存在的实体,它可以拥有自己独立的资源,每一个进程都拥有自己私有的地址空间,在没有经过进程本身允许的情况下,一个用户进程不可以直接访问其他进程的地址空间。

  • 动态性:进程与程序的区别在于,程序只是一个静态的指令集合,而进程是一个正在系统中活动的指令集合。在进程中加入了时间的概念,进程具有自己的生命周期和各种不同的状态,这些概念在程序中都是不具备的。

  • 并发性:多个进程可以在单个处理器上并发执行,多个进程不会相互影响

进程和线程的区别

线程则是扩展了进程的概念,使得同一个进程可以同时并发处理多个任务,线程也被称作轻量级进程,是进程的执行单元。

线程与进程的区别:

  • 地址空间: 进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;

  • 资源拥有: 进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源

  • 线程是处理器调度的基本单位,但进程不是.

  • 二者均可并发执行.

进程是系统进行资源分配和调度的一个独立单位。线程是进程的一个实体,是CPU调度和分派的基本单位.

线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。

线程创建:

  1. 继承 Thread: Thread本质上也是实现了Runnable接口的一个实例,它代表一个线程的实例

  2. 实现Runnable: 如果一个类已经extends另一个类,就无法直接extends Thread,此时,必须实现一个Runnable接口

  3. 使用Callable和future: ExecutorService、Callable、Future这个对象实际上都是属于Executor框架中的功能类

Callable和Runnable的区别如下:

  • Callable定义的方法是call,而Runnable定义的方法是run。
  • Callable的call方法可以有返回值,而Runnable的run方法不能有返回值。
  • Callable的call方法可抛出异常,而Runnable的run方法不能抛出异常。
  • 运行Callable任务可拿到一个Future对象。

使用Callable,Future返回结果

Future<V>代表一个异步执行的操作,通过get()方法可以获得操作的结果,如果异步操作还没有完成,则,get()会使当前线程阻塞。FutureTask<V>实现了Future<V>和Runable<V>。Callable代表一个有返回值得操作。
Callable<Integer> func = new Callable<Integer>(){  
    public Integer call() throws Exception {  
        System.out.println("inside callable");  
        Thread.sleep(1000);  
        return new Integer(8);  
    }         
};        
FutureTask<Integer> futureTask  = new FutureTask<Integer>(func);  
Thread newThread = new Thread(futureTask);  
newThread.start();  

try {  
    System.out.println("blocking here");  
    Integer result = futureTask.get();  
    System.out.println(result);  
} catch (InterruptedException ignored) {  
} catch (ExecutionException ignored) {  
} 

详情可见http://www.iteye.com/topic/366591

ExecutorService 线程池

Executors类,提供了一系列工厂方法用于创先线程池,返回的线程池都实现了ExecutorService接口

  1. newCachedThreadPool() 缓存型池子,先查看池中有没有以前建立的线程,如果有,就reuse.如果没有,就建一个新的线程加入池中,缓存型池子通常用于执行一些生存期很短的异步型任务,能reuse的线程,必须是timeout IDLE内的池中线程,缺省timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。

  2. newFixedThreadPool(int nThreads) newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程,其独特之处:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子

  3. newSingleThreadPool() 创建一个只有单线程的线程池

  4. newScheduledThreadPool(int corePoolsize) 创建具有指定线程数的线程池,它可以在指定延迟后执行任务,corePoolsize指池中所保持的线程数

  5. newSingleThreadScheduledExecutor() 创建只有一个线程的线程池,它可以在指定延迟后执行线程任务

ExecutoreService提供了submit()方法,传递一个Callable,或Runnable,返回Future。如果Executor后台线程池还没有完成Callable的计算,这调用返回Future对象的get()方法,会阻塞直到计算完成。

ThreadPoolExecutor 类

ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue)

ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务; Executors方法提供的线程服务,都是通过参数设置来实现不同的线程池机制。

对应参数介绍:

  • corePoolSize 线程池维护线程的最少数量
  • maximumPoolSize 线程池维护线程的最大数量
  • keepAliveTime 线程池维护线程所允许的空闲时间,终止前多余的空闲线程等待新任务的最长时间
  • unit 空闲时间单位
  • workQueue 线程池所使用的缓冲队列
  • handle 线程池对拒绝任务的处理策略

当一个任务通过execute(Runnable)方法欲添加到线程池时:

如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。

如果此时线程池中的数量等于 corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。

如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。也就是:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。

当线程池中的线程数量大于 corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。

详情可见http://825635381.iteye.com/blog/2184680

线程基础介绍.........................................................................................................................................15 定义多线程术语.........................................................................................................................................15 符合多线程标准.........................................................................................................................................16 多线程的益处.............................................................................................................................................17 提高应用程序的响应.........................................................................................................................17 有效使用多处理器..............................................................................................................................17 改进程序结构.....................................................................................................................................17 占用较少的系统资源.........................................................................................................................17 结合线程和RPC(远程过程调用) ...............................................................................................18 多线程概念..................................................................................................................................................18 并发性和并行性.................................................................................................................................18 多线程结构一览.................................................................................................................................18 线程调度..............................................................................................................................................19 线程取消..............................................................................................................................................19 线程同步..............................................................................................................................................20 使用64 位体系结构...................................................................................................................................20 2 基本线程编程.............................................................................................................................................23 线程库...........................................................................................................................................................23 创建缺省线程.....................................................................................................................................23 等待线程终止.....................................................................................................................................25 简单线程的示例.................................................................................................................................26 分离线程..............................................................................................................................................28 为线程特定数据创建键.....................................................................................................................28 删除线程特定数据键.........................................................................................................................30 设置线程特定数据..............................................................................................................................31 3 获取线程特定数据..............................................................................................................................31 获取线程标识符.................................................................................................................................35 比较线程ID .........................................................................................................................................36 初始化线程..........................................................................................................................................36 停止执行线程.....................................................................................................................................37 设置线程的优先级..............................................................................................................................38 获取线程的优先级..............................................................................................................................39 向线程发送信号.................................................................................................................................40 访问调用线程的信号掩码.................................................................................................................41 安全地Fork .........................................................................................................................................41 终止线程..............................................................................................................................................42 结束.......................................................................................................................................................42 取消线程..............................................................................................................................................43 取消线程..............................................................................................................................................44 启用或禁用取消功能.........................................................................................................................45 设置取消类型.....................................................................................................................................46 创建取消点..........................................................................................................................................46 将处理程序推送到栈上.....................................................................................................................47 从栈中弹出处理程序.........................................................................................................................47 3 线程属性......................................................................................................................................................49 属性对象......................................................................................................................................................49 初始化属性..........................................................................................................................................50 销毁属性..............................................................................................................................................51 设置分离状态.....................................................................................................................................52 获取分离状态.....................................................................................................................................53 设置栈溢出保护区大小.....................................................................................................................54 获取栈溢出保护区大小.....................................................................................................................55 设置范围..............................................................................................................................................55 获取范围..............................................................................................................................................57 设置线程并行级别..............................................................................................................................57 获取线程并行级别..............................................................................................................................58 设置调度策略.....................................................................................................................................58 获取调度策略.....................................................................................................................................59 设置继承的调度策略.........................................................................................................................60 获取继承的调度策略.........................................................................................................................61 目录 4 多线程编程指南• 2006年10月 设置调度参数.....................................................................................................................................62 获取调度参数.....................................................................................................................................63 设置栈大小..........................................................................................................................................65 获取栈大小..........................................................................................................................................66 关于栈...................................................................................................................................................67 设置栈地址和大小..............................................................................................................................68 获取栈地址和大小..............................................................................................................................70 4 用同步对象编程.........................................................................................................................................73 互斥锁属性..................................................................................................................................................74 初始化互斥锁属性对象.....................................................................................................................75 销毁互斥锁属性对象.........................................................................................................................76 设置互斥锁的范围..............................................................................................................................76 获取互斥锁的范围..............................................................................................................................77 设置互斥锁类型的属性.....................................................................................................................78 获取互斥锁的类型属性.....................................................................................................................79 设置互斥锁属性的协议.....................................................................................................................80 获取互斥锁属性的协议.....................................................................................................................82 设置互斥锁属性的优先级上限........................................................................................................83 获取互斥锁属性的优先级上限........................................................................................................84 设置互斥锁的优先级上限.................................................................................................................84 获取互斥锁的优先级上限.................................................................................................................85 设置互斥锁的强健属性.....................................................................................................................86 获取互斥锁的强健属性.....................................................................................................................88 使用互斥锁..................................................................................................................................................89 初始化互斥锁.....................................................................................................................................89 使互斥保持一致.................................................................................................................................90 锁定互斥锁..........................................................................................................................................91 解除锁定互斥锁.................................................................................................................................93 使用非阻塞互斥锁锁定.....................................................................................................................94 销毁互斥锁..........................................................................................................................................95 互斥锁定的代码示例.........................................................................................................................96 条件变量属性...........................................................................................................................................102 初始化条件变量属性.......................................................................................................................103 删除条件变量属性............................................................................................................................103 设置条件变量的范围.......................................................................................................................104 目录 5 获取条件变量的范围.......................................................................................................................105 使用条件变量...........................................................................................................................................106 初始化条件变量...............................................................................................................................106 基于条件变量阻塞............................................................................................................................108 解除阻塞一个线程............................................................................................................................109 在指定的时间之前阻塞................................................................................................................... 111 在指定的时间间隔内阻塞............................................................................................................... 113 解除阻塞所有线程............................................................................................................................ 114 销毁条件变量状态............................................................................................................................ 116 唤醒丢失问题................................................................................................................................... 117 生成方和使用者问题....................................................................................................................... 117 使用信号进行同步...................................................................................................................................121 命名信号和未命名信号...................................................................................................................122 计数信号量概述...............................................................................................................................122 初始化信号........................................................................................................................................123 增加信号............................................................................................................................................125 基于信号计数进行阻塞...................................................................................................................126 减小信号计数...................................................................................................................................126 销毁信号状态...................................................................................................................................127 使用信号时的生成方和使用者问题.............................................................................................128 读写锁属性................................................................................................................................................130 初始化读写锁属性............................................................................................................................131 销毁读写锁属性...............................................................................................................................131 设置读写锁属性...............................................................................................................................132 获取读写锁属性...............................................................................................................................132 使用读写锁................................................................................................................................................133 初始化读写锁...................................................................................................................................133 获取读写锁中的读锁.......................................................................................................................134 读取非阻塞读写锁中的锁...............................................................................................................135 写入读写锁中的锁............................................................................................................................136 写入非阻塞读写锁中的锁...............................................................................................................136 解除锁定读写锁...............................................................................................................................137 销毁读写锁........................................................................................................................................137 跨进程边界同步.......................................................................................................................................138 生成方和使用者问题示例...............................................................................................................138 比较元语....................................................................................................................................................141 目录 6 多线程编程指南• 2006年10月 5 使用Solaris 软件编程..............................................................................................................................143 进程创建中的fork 问题...........................................................................................................................143 Fork-One 模型...................................................................................................................................144 Fork-all 模型......................................................................................................................................147 选择正确的Fork ...............................................................................................................................147 进程创建:exec 和exit 问题................................................................................................................147 计时器、报警与剖析...............................................................................................................................148 每LWP POSIX 计时器......................................................................................................................148 每线程报警........................................................................................................................................148 剖析多线程程序...............................................................................................................................149 非本地转向:setjmp 和longjmp ...........................................................................................................149 资源限制....................................................................................................................................................149 LWP 和调度类...........................................................................................................................................149 分时调度............................................................................................................................................150 实时调度............................................................................................................................................150 公平共享调度程序............................................................................................................................151 固定优先级调度...............................................................................................................................151 扩展传统信号...........................................................................................................................................151 同步信号............................................................................................................................................152 异步信号............................................................................................................................................152 延续语义............................................................................................................................................152 对信号执行的操作............................................................................................................................154 定向于线程的信号............................................................................................................................155 完成语义............................................................................................................................................157 信号处理程序和异步信号安全......................................................................................................158 中断对条件变量的等待...................................................................................................................160 I/O 问题......................................................................................................................................................161 I/O 作为远程过程调用.....................................................................................................................161 人为的异步性...................................................................................................................................162 异步I/O ..............................................................................................................................................162 共享的I/O 和新的I/O 系统调用...................................................................................................163 getc 和putc 的替代项......................................................................................................................164 6 安全和不安全的接口...............................................................................................................................165 线程安全....................................................................................................................................................165 MT接口安全级别....................................................................................................................................167 目录 7 不安全接口的可重复执行函数......................................................................................................168 异步信号安全函数...................................................................................................................................168 库的MT安全级别...................................................................................................................................169 不安全库............................................................................................................................................169 7 编译和调试................................................................................................................................................171 编译多线程应用程序...............................................................................................................................171 为编译做准备...................................................................................................................................171 选择Solaris 语义或POSIX 语义.....................................................................................................171 包括 或 ...................................................................................................172 定义_REENTRANT 或_POSIX_C_SOURCE ...........................................................................................173 使用libthread 或libpthread 链接..............................................................................................173 与POSIX 信号的-lrt 链接.............................................................................................................174 将原有模块与新模块链接...............................................................................................................174 备用线程库................................................................................................................................................175 调试多线程程序.......................................................................................................................................175 多线程程序中常见的疏忽性问题.................................................................................................175 使用TNF 实用程序跟踪和调试.....................................................................................................176 使用truss ..........................................................................................................................................176 使用mdb ..............................................................................................................................................176 使用dbx ..............................................................................................................................................177 8 Solaris 线程编程.......................................................................................................................................179 比较Solaris 线程和POSIX 线程的API .................................................................................................179 API 的主要差异................................................................................................................................179 函数比较表........................................................................................................................................180 Solaris 线程的独有函数...........................................................................................................................183 暂停执行线程...................................................................................................................................183 继续执行暂停的线程.......................................................................................................................185 相似的同步函数-读写锁......................................................................................................................186 初始化读写锁...................................................................................................................................186 获取读锁............................................................................................................................................188 尝试获取读锁...................................................................................................................................188 获取写锁............................................................................................................................................189 尝试获取写锁...................................................................................................................................189 解除锁定读写锁...............................................................................................................................190 目录 8 多线程编程指南• 2006年10月 销毁读写锁的状态............................................................................................................................191 相似的Solaris 线程函数...........................................................................................................................193 创建线程............................................................................................................................................193 获取最小栈大小...............................................................................................................................195 获取线程标识符...............................................................................................................................196 停止执行线程...................................................................................................................................196 向线程发送信号...............................................................................................................................197 访问调用线程的信号掩码...............................................................................................................197 终止线程............................................................................................................................................198 等待线程终止...................................................................................................................................198 创建线程特定的数据键...................................................................................................................200 设置线程特定的数据值...................................................................................................................201 获取线程特定的数据值...................................................................................................................201 设置线程的优先级............................................................................................................................202 获取线程的优先级............................................................................................................................203 相似的同步函数-互斥锁......................................................................................................................204 初始化互斥锁...................................................................................................................................204 销毁互斥锁........................................................................................................................................206 获取互斥锁........................................................................................................................................207 释放互斥锁........................................................................................................................................207 尝试获取互斥锁...............................................................................................................................208 相似的同步函数:条件变量..................................................................................................................208 初始化条件变量...............................................................................................................................208 销毁条件变量...................................................................................................................................210 等待条件............................................................................................................................................210 等待绝对时间................................................................................................................................... 211 等待时间间隔...................................................................................................................................212 解除阻塞一个线程............................................................................................................................213 解除阻塞所有线程............................................................................................................................213 相似的同步函数:信号...........................................................................................................................214 初始化信号........................................................................................................................................214 增加信号............................................................................................................................................215 基于信号计数阻塞............................................................................................................................216 减小信号计数...................................................................................................................................216 销毁信号状态...................................................................................................................................217 跨进程边界同步.......................................................................................................................................218 生成方和使用者问题示例...............................................................................................................218 目录 9 fork() 和Solaris 线程的特殊问题.........................................................................................................220 9 编程原则....................................................................................................................................................221 重新考虑全局变量...................................................................................................................................221 提供静态局部变量...................................................................................................................................222 同步线程....................................................................................................................................................223 单线程策略........................................................................................................................................224 可重复执行函数...............................................................................................................................224 避免死锁....................................................................................................................................................226 与调用相关的死锁............................................................................................................................227 锁定原则............................................................................................................................................227 线程代码的一些基本原则......................................................................................................................227 创建和使用线程.......................................................................................................................................228 使用多处理器...........................................................................................................................................228 基础体系结构...................................................................................................................................229 线程程序示例...........................................................................................................................................233 需要进一步阅读的内容...................................................................................................................233 A 样例应用程序:多线程grep ..................................................................................................................235 tgrep 的说明.............................................................................................................................................235 B Solaris 线程示例: barrier.c ................................................................................................................293 索引.............................................................................................................................................................303
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值