Java 线程与线程池简例
来源:互联网 发布:知乎 玄幻小说推荐 编辑:程序博客网 时间:2024/05/16 11:08
实现线程有两种方法
1. 继承 Thread 类, 重新 run 方法, 调用类的 start 方法启动线程
2. 实现 Runnable 接口, 实现 run 方法, 通过 new Thread(Runnable).start() 启动线程
线程有五种状态, 创建、就绪、运行、阻塞、死亡
阻塞: 线程正在运行时, 被暂停之后再继续运行, 如 sleep suspend wait 等方法导致线程阻塞
死亡: run 执行完毕或调用 stop 方法
start 和 run 方法区别:
start 方法启动线程, 实现多线程运行(并行)
1. 继承 Thread 类, 重新 run 方法, 调用类的 start 方法启动线程
2. 实现 Runnable 接口, 实现 run 方法, 通过 new Thread(Runnable).start() 启动线程
线程有五种状态, 创建、就绪、运行、阻塞、死亡
创建: 实例化对象
就绪: 实例化对象, 调用 start 方法
运行: 线程调度器将就绪的线程设置为当前线程阻塞: 线程正在运行时, 被暂停之后再继续运行, 如 sleep suspend wait 等方法导致线程阻塞
死亡: run 执行完毕或调用 stop 方法
start 和 run 方法区别:
start 方法启动线程, 实现多线程运行(并行)
run 方法为普通方法调用, 程序按调用顺序执行
继承方式:
public class ExtendThread extends Thread {private String str;public ExtendThread(String str) {this.str = str;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(str + ":" + i);}}public static void main(String[] args) {new ExtendThread("T1").start();new ExtendThread("T2").start();}}
接口方式:
public class RunnableThread implements Runnable {private String str;public RunnableThread(String str) {this.str = str;}@Overridepublic void run() {for (int i = 0; i < 10; i++) {System.out.println(str + ":" + i);}}public static void main(String[] args) {new Thread(new RunnableThread("T1")).start();new Thread(new RunnableThread("T2")).start();}}使用线程池来跑线程
new Thread(task).start() 的缺点:
消耗性能、缺乏管理、可无限创建导致占用过多系统资源
线程池的优点:
重用存在的线程,减少对象创建,可有效控制最大并发线程数,提高系统资源的使用率
Executor 提供4种线程池
newCachedThreadPool
创建一个可缓存的线程池(大小是不定值),调用 execute 将重用以前构造的线程,如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程
newFixedThreadPool
创建固定数目线程的线程池,可控制线程最大并发数,超出的线程会在队列中等待
newScheduledThreadPool
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类
newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,当上一个执行完之后才会执行第二个
创建固定数目线程的线程池,可控制线程最大并发数,超出的线程会在队列中等待
newScheduledThreadPool
创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类
newSingleThreadExecutor
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,当上一个执行完之后才会执行第二个
示例:
import java.util.concurrent.Executor;import java.util.concurrent.Executors;import org.junit.Test;public class ThreadPool {// 创建一个固定数量的线程池 pool-1Executor executor = Executors.newFixedThreadPool(10);Runnable task = new Runnable() {@Overridepublic void run() {System.out.println("当前线程:" + Thread.currentThread().getName());}};@Testpublic void runTask() {for (int i = 0; i < 15; i++) {executor.execute(task);// new Thread(task).start();}}}运行结果:在 pool-1 线程池中,总共只会跑出 10 个线程
如果使用 new Thread() 则会跑出 15 个线程
阅读全文
0 0
- Java 线程与线程池简例
- Java线程与内核线程
- Java线程与线程状态
- java io与线程
- Java 进程与线程
- Java - 网络与线程
- Java线程与多线程
- Java线程与同步
- Java 进程与线程
- JAVA 线程与锁
- Java线程与进程
- java进程与线程
- Java进程与线程
- java线程与锁
- Java:进程与线程
- java与线程
- Java与线程
- java与线程池
- Java中的单例、策略、适配器模式
- HDU 1016 Prime Ring Problem
- Python——学生成绩管理系统
- 最短路问题
- Python3random()函数
- Java 线程与线程池简例
- js中变量的声明和变量的命名规范
- node.js学习之node的安装
- BZOJ 1717: [Usaco2006 Dec]Milk Patterns 产奶的模式 二分答案 哈希/后缀数组
- RequireJS加载js文件
- mybatis的使用
- Python的中文编码问题
- Android 拷贝db文件到sqlite数据库。
- Android Studio 超级简单的打包生成apk