您当前的位置 :星岛中文网>资讯频道 > 快讯 > 正文
java bus Java并发——阿里架构师
2019-06-24 17:13:40 来源:星岛中文网

一、创建线程1.创建普通对象,只是在JVM的堆里分配一块内存而已

2.创建线程,需要调用操作系统内核的API,然后操作系统需要为线程分配一系列资源,成本很高

线程是一个重量级对象,应该避免频繁创建和销毁,采用线程池方案二、一般的池化资源

// 假设Java线程池采用一般意义上池化资源的设计方法

class ThreadPool {

// 获取空闲线程

Thread acquire() {

}

// 释放线程

void release(Thread t) {

}

}

// 期望的使用

ThreadPool pool;

Thread T1 = pool.acquire();

// 传入Runnable对象

T1.execute(() -> {

// 具体业务逻辑

});

三、生产者-消费者模式业界线程池的设计,普遍采用生产者-消费者模式,线程池的使用方是生产者,线程池本身是消费者

public class MyThreadPool {

// 工作线程负责消费任务并执行任务

class WorkerThread extends Thread {

@Override

public void run() {

// 循环取任务并执行

while (true) {

Runnable task = null;

try {

task = workQueue.take();

} catch (InterruptedException e) {

}

task.run();

}

}

}

// 利用阻塞队列实现生产者-消费者模式

private BlockingQueue workQueue;

// 内部保存工作线程

List threads = new ArrayList<>();

public MyThreadPool(int poolSize, BlockingQueue workQueue) {

this.workQueue = workQueue;

for (int i = 0; i < poolSize; i++) {

WorkerThread work = new WorkerThread();

work.start();

threads.add(work);

}

}

// 提交任务

public void execute(Runnable command) throws InterruptedException {

workQueue.put(command);

}

public static void main(String[] args) throws InterruptedException {

// 创建有界阻塞队列

BlockingQueue workQueue = new LinkedBlockingQueue<>(2);

// 创建线程池

MyThreadPool pool = new MyThreadPool(10, workQueue);

// 提交任务

pool.execute(() -> {

System.out.println("hello");

});

}

}

四、Java线程池Ⅰ. ThreadPoolExecutor

public ThreadPoolExecutor(int corePoolSize,

int maximumPoolSize,

long keepAliveTime,

TimeUnit unit,

BlockingQueue workQueue,

ThreadFactory threadFactory,

RejectedExecutionHandler handler)

// 让所有线程都支持超时,如果线程池很闲,那么将撤销所有线程

public void allowCoreThreadTimeOut(boolean value)

1.corePoolSize:线程池保有的最小线程数

2.maximumPoolSize:线程池创建的最大线程数

3.keepAliveTime & unit

如果一个线程空闲了keepAliveTime & unit,并且线程池的线程数大于corePoolSize,那么这个空闲的线程就要被回收4.workQueue:工作队列

5.threadFactory:自定义如何创建线程

6.handler

线程池中的所有线程都很忙碌,并且工作队列也满了(工作队列是有界队列),此时提交任务,线程池会拒绝接收CallerRunsPolicy:提交任务的线程自己去执行该任务AbortPolicy:默认的拒绝策略,抛出RejectedExecutionExceptionDiscardPolicy:直接丢弃任务,不会抛出任何异常DiscardOldestPolicy:丢弃最老的任务,然后把新任务加入到工作队列中Ⅱ. Executors1.不建议使用Executors,因为Executors提供的很多默认方法使用的是无界队列LinkedBlockingQueue

2.在高负载的情况下,无界队列容易导致OOM,而OOM会导致所有请求都无法处理

3.因此强烈建议使用有界队列

Ⅲ. 拒绝策略1.使用有界队列,当任务过多时,线程池会触发拒绝策略

2.线程池默认的拒绝策略会抛出RejectedExecutionException,这是一个运行时异常,开发时很容易忽略

3.如果线程池处理的任务非常重要,可以自定义拒绝策略

Ⅳ. 异常处理1.使用ThreadPoolExecutor.execute()方法提交任务时,如果任务在执行过程中出现运行时异常

会导致执行任务的线程终止,并且无法获得任何通知2.因此最稳妥的方法还是捕获所有异常并处理

try {

// 业务逻辑

} catch (RuntimeException x) {

// 按需处理

} catch (Throwable x) {

// 按需处理

}

关键词: java 阿里架构师 开发

分享到:
版权和免责申明

凡注有"星岛中文网"或电头为"星岛中文网"的稿件,均为星岛中文网独家版权所有,未经许可不得转载或镜像;授权转载必须注明来源为"星岛中文网",并保留"星岛中文网"的电头。

精选 导读

女子穿高跟鞋单脚站立上演“练瑜伽式”骑车 交通

道路千万条,安全第一条。11月4日,有网友在广州的路上拍到惊人一幕。只见一位女子在花都地铁广场站迎宾大道马路上大秀车技,穿高跟鞋单脚

发布时间: 2022-11-07 09:41

山东女子忘拉手刹致溜车 竟徒手将车推了回去

近日,山东女子忘拉手刹致溜车,徒手推回SUV的视频在网上热传,网友调侃:谁还敢惹女司机。据报道,11月4日,山东临沂一女子停车去开铁门,

发布时间: 2022-11-07 09:37

济宁一小伙边骑电动车边双手玩手机 车头疯狂摆动

11月5日,山东济宁一年轻小伙一边骑电动车,一边低头双手玩手机,所幸路过司机好心提醒。视频中,这名小伙驾驶一辆两轮电动车,双手完全脱

发布时间: 2022-11-07 09:34

浙江台州出现不明飞行物 空中出现多个亮点 专家

据报道,7月26日,有多名浙江台州网友发视频称,在空中看到不明飞行物,当时空中出现了多个亮点,排在一条直线上。网传视频中,这几个明亮

发布时间: 2022-07-28 09:43

离谱!潮州一女孩从古茗奶茶喝出一只壁虎 还从嘴

喝奶茶喝出一只壁虎,而且还是从嘴里给拽了出来,这画面实在是太让人无法直视。据信号财经报道,7月26日,广东潮州,女孩称在古茗奶茶内喝

发布时间: 2022-07-28 09:40