多线程与高并发系列(二)

1. 线程的创建方式

1.1 继承Thread

public class MyThread extends Thread {
	public void run() {
		System.out.println("Mythread.run()");
	}
}
MyThread t1 = new MyThread();
t1.start();

1.2 实现Runnable

public class MyThread extends OtherClass implements Runnable(){
	public void run(){
		System.out.println("MyThread.run");
	}
}
//启动 MyThread
MyThread t1= new MyThread();  
t1.run(); 

1.3 基于线程池的方式

public class MyThread_1{
		public void test(){
			ExecutorService threadPool = Executors.newFixedThreadPool(10);
			while (true){
				threadPool.execute(new Runnable() {
					@Override
					public void run() {
						System.out.println("ThreadName :" + Thread.currentThread().getName());
						try {
							Thread.sleep(300);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				});
			}
		}

	}

1.4 ExecutorService、Callable、Future 有返回值线程

public class MyThread_2{
		public void test_2() throws ExecutionException, InterruptedException {
			ExecutorService pool = Executors.newFixedThreadPool(10);
			List<Future> list = new ArrayList<>();
			for (int i = 0; i < 10; i++) {
				int finalI = i;
				Callable c = () -> finalI;
				Future f = pool.submit(c);
				list.add(f);
			}
			pool.shutdown();
			for (Future f : list) {
				System.out.println("res:"+f.get().toString());
			}
		}
	}

1.4.1 Executor VS ExecutorService VS Executors

  • ExecutorService 继承了Executor接口,是Executor的子接口
  • Executor 定义了 execute() 方法,接收Runnable 接口的对象,没有返回值;ExecutorService 中的 submit() 可以接收 Runnable 和 Callable 接口的对象,通过Future(存储执行的将来结果) 对象返回运算结果
  • ExecutorService 可以创建线程池,调用shutDown() 终止线程。
  • Executors 类提供工厂方法创建不同类型的线程池。如 newSingleThreadExecutor()

2. ThreadPoolExecutor

ThreadPoolExecutor 继承自 ExecutorService。

2.1 构造方法

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)

每个参数的含义:

  • corePoolSize,核心线程数
  • maximumPoolSize,最大线程数
  • keepAliveTime,线程数超过核心线程数,空闲时,多长时间被杀死
  • unit, 前一个参数的时间单位
  • workQueue,任务队列
  • threadFactory,线程工厂
  • handler,超出线程范围和队列容量是采用的拒绝策略

2.2 拒绝策略

线程池中线程已经用完,无法继续为新任务服务,等待队列也排满了,不能容纳新任务时,需要采用拒绝策略。
JDK提供了一下四种,也可以自定义拒绝策略

拒绝策略描述
AbortPolicy直接抛出异常,阻止系统正常运行
CallerRunsPolicy若线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务,会影响任务的提交效率
DiscardPolicy不能执行的任务直接删除
DiscardOldPolicy若线程执行尚未关闭,最老的线程删除,即工作队列头部的任务删除

2.3 线程池工作过程

  • 线程池刚创建时,里边没有线程,任务队列是作为参数传进来的。
  • 调用execute()方法添加任务时,先启动核心线程,核心线程满了之后,再启动非核心线程,非核心线程满了之后,新任务放入队列中,若队列也满了,采用拒绝策略。
  • 当一个线程完成任务时,它会从队列中取下一个任务来执行。
  • 当线程空闲,且超过keepAliveTime时,若运行线程数大于核心线程数,会停掉线程。线城市的所有任务都完成以后,线程池最终会收缩到核心线程数的大小。
  • 线程池底层是通过addworker()方法添加线程的,该方法是通过自旋锁,实现worker数量+1的。

2.4 阻塞队列(BlockingQueue)

阻塞队列描述
LinkedBlockingQueue无界,直到内存满
ArrayBlockingQueue有界,put()阻塞,add()抛异常,offer()不阻塞
DelayQueue支持延时获取元素的无界阻塞队列
SynchronousQuene不存储元素的阻塞队列,只有有take()才put(),类似于传球手,可用于两个线程交换书
TransferQueue装完元素等着被消费 ,添加了transfer(),等待消费结果,例如:等着支付结果
PriorityQueue支持优先级的无界队列 ,排好顺序的树,内部采用了二叉树

Queue相比较与数组而言,添加了一些对线程友好的api。

  • offer(),加值,返回成功与否
  • peek(),取值,但不remove
  • poll(),取值,并remove
  • put(),满了就会等待,阻塞
  • take(),取值,为空时等待

3. 线程池种类

线程池种类线程数指定方式使用场景
SingleThreadPool一个线程任务队列为LinkedBlockingQueue ,管理线程周期、任务队列
CacheThreadPool根据需要动态创建新线程线程波动不稳定时使用,短期异步任务, 任务队列为synchronousQueue
FixThreadPool可重用的,固定线程数线程波动稳定时使用
SchdualThreadPool1定时任务线程池底层是ThreadPoolExecutor
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值