Java线程池学习

一、实现Java多线程的方法

1、继承Thread类创建多线程

Thread类本质实现了Runnable接口。启动线程为start0()方法。是个native方法。

 1 public class ThreadProcess extends Thread {
 2
 3     @Override
 4     public void run(){
 5         long lastTime = System.currentTimeMillis();
 6         for(int i = 0; i < 1; i++){
 7             int ele = Integer.MAX_VALUE;
 8             while (ele >= 0){
 9                 int ele2 = ele - Integer.MAX_VALUE + 65535 - 37666 + 44443;
10                 int temp = Math.max(ele2, ele);
11                 if(temp != ele){
12                     temp = ele;
13                 }
14                 ele = temp-1;
15             }
16         }
17         System.out.println("Time cost from thread " + (System.currentTimeMillis() -  lastTime));
18     }
19 }

2、实现Runnable。一个类已经继承了Thread类就无法继承其它类。

 1 class AccountOperator implements Runnable {
 2     private int count;
 3     private final byte[] lock = new byte[0];
 4
 5     public AccountOperator() {
 6         this.count = 0;
 7     }
 8
 9     public void run() {
10         synchronized (lock) {
11             count++;
12             System.out.println(Thread.currentThread().getName() + ":" + count);
13         }
14     }
15 }

3、实现Callable

如果运行完线程并且需要线程返回结果的时候,可以

 1 import java.util.concurrent.Callable;
 2
 3 public class GetDataThread<V> implements Callable<V> {
 4     private V v;
 5
 6     public GetDataThread(V v) {
 7         this.v = v;
 8     }
 9
10     @Override
11     public V call() {
12         return this.v;
13     }
14 }
 1 public class Main {
 2     public static void main(String[] args) throws Exception{
 3         String data = "data";
 4         FutureTask<String> ft = new FutureTask<>(new GetDataCal<>(data));
 5         Thread t = new Thread(ft);
 6         t.start();
 7         String res = ft.get();
 8         System.out.println("Result: " + res);
 9     }
10 }

二、Java线程池

线程的创建和销毁是需要时间的。记线程创建的时间为T1, 线程运行的时间为T2,线程销毁的时间为T3。如果T1 + T3 远远大于 T2,并且有很多这样的任务需要并行执行时,就可以使用线程池。

因为通过线程池,线程资源可以重复使用。

1、常见的线程池

  • newSingleThreadExecutor
  • newFixedThreadExecutor
  • newCachedThreadExecutor
  • newScheduleThreadExecutor

2、首先看下ThreadPoolExecutor方法。构造函数包含了几个重要参数,

1     public ThreadPoolExecutor(int corePoolSize,
2                               int maximumPoolSize,
3                               long keepAliveTime,
4                               TimeUnit unit,
5                               BlockingQueue<Runnable> workQueue
6                               RejectedExecutionHandler handler){}
  1. corePoolSize, 线程池核心线程数量
  2. maximumPoolSize,线程池最大线程数
  3. keepAliveTime,当活跃线程数大于核心线程数时,空闲的多余线程最大存活时间
  4. unit  存活时间的单位
  5. workQueue  存放任务的队列
  6. handler  超出线程范围和队列容量的任务的处理程序,也叫拒绝策略。

3、先看下线程池的实现原理

提交一个任务到线程池,线程池的处理流程如下

  • 判断核心线程池是否都在执行任务,如果不是,则创建新的线程执行任务
  • 若核心线程都在执行任务,判断工作队列满没满,如果没满,把任务提交给队列
  • 若队列满了,判断线程池里的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务,如果满了则交给拒绝策略处理

原文地址:https://www.cnblogs.com/ylxn/p/10354551.html

时间: 2024-10-12 07:21:51

Java线程池学习的相关文章

Java 线程池学习

Reference: <创建Java线程池>[1],<Java线程:新特征-线程池>[2], <Java线程池学习>[3],<线程池ThreadPoolExecutor使用简介>[4],<Java5中的线程池实例讲解>[5],<ThreadPoolExecutor使用和思考>[6] [1]中博主自己通过ThreadGroup实现一个线程池(挺方便理解的),使用的是jdk1.4版本,Jdk1.5版本以上提供了现成的线程池. [2]中介绍

java线程池学习(一)

前言 在实际工作中,线程是一个我们经常要打交道的角色,它可以帮我们灵活利用资源,提升程序运行效率.但是我们今天不是探讨线程!我们今天来聊聊另一个与线程息息相关的角色:线程池.本篇文章的目的就是全方位的解析线程池的作用,以及jdk中的接口,实现以及原理,另外对于某些重要概念,将从源码的角度探讨. tip:本文较长,建议先码后看. 线程池介绍 首先我们看一段创建线程并且运行的常用代码: for (int i = 0; i < 100; i++) { new Thread(() -> { Syste

Java线程池学习总结

一 使用线程池的好处 池化技术相比大家已经屡见不鲜了,线程池.数据库连接池.Http 连接池等等都是对这个思想的应用.池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率. 线程池提供了一种限制和管理资源(包括执行一个任务). 每个线程池还维护一些基本统计信息,例如已完成任务的数量. 这里借用<Java 并发编程的艺术>提到的来说一下使用线程池的好处: 降低资源消耗.通过重复利用已创建的线程降低线程创建和销毁造成的消耗. 提高响应速度.当任务到达时,任务可以不需要的等到线程创建就

java线程池学习(二)

new Thread 弊端: 1.每次new Thread 新建对象,性能差 2.线程缺乏统一管理,可能无限制的新建线程,相互竞争,可能占用过多的系统资源导致死机或者OOM 3.缺少更多的功能,如更多执行.线程中断等 线程池--ThreadPoolExecutor corePoolSize: 核心线程数量 maxinumPool: 线程最大线程数 workqueue: 阻塞队列,存储等待执行的任务,很重要,对线程池产生重大的影响 . keepaliveTime: 线程没有任务执行时,最多保持多久

java线程池的学习

package advancedJava;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.TimeUnit; * java 线程池学习 * @author: cuiH * Date: 13-12-7public class ThreadPoolTest { * 线程池的概念 * jdk5提出了ThreadPool的概念 * 之

JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue .

从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.以下是我的学习过程. 首先是构造函数签名如下: [java] view plain copy print ? public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<

【Java线程池快速学习教程】

1. Java线程池 线程池:顾名思义,用一个池子装载多个线程,使用池子去管理多个线程. 问题来源:应用大量通过new Thread()方法创建执行时间短的线程,较大的消耗系统资源并且系统的响应速度变慢.[在一个什么程度上能够判断启用线程池对系统的资源消耗比启动定量的new Thread()资源消耗低?这个怎么测试?][用户体验卡顿?慢?观察CPU百分比?] 解决办法:使用线程池管理短时间执行完毕的大量线程,通过重用已存在的线程,降低线程创建和销毁造成的消耗,提高系统响应速度. 2. Java线

Java深入学习13:Java线程池

Java深入学习13:Java线程池 一.线程池的作用 线程池提供一个线程队列,队列中保存着所有等待状态的线程.避免了创建与销毁等额外开销,提交了响应的速度. 二.类关系 Java线程池相关的接口和类均在 java.util.concurrent 包下,其相关关系(部分)如下 三.Executors类以及相关常用方法介绍 1-Executors类简介:简单的说是线程方法的工具类,提供了 创建线程池等方法. 2-ExecutorService 类创建线程池 //创建缓存线程池,线程数量不固定,可以

深入学习Java线程池

在前面的例子中,我们都是通过new Thread来创建一个线程,由于线程的创建和销毁都需要消耗一定的CPU资源,所以在高并发下这种创建线程的方式将严重影响代码执行效率.而线程池的作用就是让一个线程执行结束后不马上销毁,继续执行新的任务,这样就节省了不断创建线程和销毁线程的开销. ThreadPoolExecutor 创建Java线程池最为核心的类为ThreadPoolExecutor: 它提供了四种构造函数来创建线程池,其中最为核心的构造函数如下所示: 1234567 public Thread