java 线程泄之一

线程及线程池

1.线程池的作用

限制系统中执行线程的数量

2.为什么要用线程池

2.1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务.

2.2 可以根据系统的承受能力,调整线程池中工作线线程的数目,

防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

3.线程池接口类

3.1 ExecutorService : 真正的线程池接口。

3.2 ScheduledExecutorService:能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。

3.3 ThreadPoolExecutor : ExecutorService的默认实现.

3.4 ScheduledThreadPoolExecutor : 继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。

4.线程池的静态工具类 Executors 常用的方法

4.1 newSingleThreadExecutor

创建一个单线程的线程池,采用无边界队列LinkedBlockingQueue.即线程有限,但队列无限.

4.2 newFixedThreadPool

创建固定大小的线程池,采用无边界队列LinkedBlockingQueue.即线程有限,但队列无限.

4.3 newCachedThreadPool

创建一个可缓存的线程池 ,采用SynchronousQueue队列.

4.4 newScheduledThreadPool

创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。

5.线程池的执行策略与BlockingQueue

5.1 如果运行的线程少于 corePoolSize(最小线程数量),则 Executor始终首选添加新的线程,而不进行排队.

5.2 如果运行的线程等于或多于 corePoolSize,则 Executor始终首选将请求加入队列,而不添加新的线程。

5.3 如果无法将请求加入队列,则创建新的线程,除非创建此线程超出 maximumPoolSize,在这种情况下,任务将被拒绝。

6.实例

public class MyThread extends Thread

{

private String name;

public MyThread(String name)

{

this.name = name;

}

@Override

public void run()

{

try

{

Thread.sleep(10000);

System.out.println(Thread.currentThread().getName()+name+"--正在执行!");

}

catch (InterruptedException e)

{

e.printStackTrace();

}

}

}

6.1 newSingleThreadExecutor

public class TestSingleThreadExecutor

{

public static void main(String[] args)

{

// 单线程执行

ExecutorService sngleThreadPool = Executors.newSingleThreadExecutor();

MyThread t1 = new MyThread("t1");

MyThread t2 = new MyThread("t2");

MyThread t3 = new MyThread("t3");

MyThread t4 = new MyThread("t4");

sngleThreadPool.execute(t1);

sngleThreadPool.execute(t2);

sngleThreadPool.execute(t3);

sngleThreadPool.execute(t4);

sngleThreadPool.shutdown();

}

}

6.2 ScheduledThreadPoolExecutor

public class TestScheduledThreadPool

{

public static void main(String[] args)

{

ScheduledThreadPoolExecutor exec = new ScheduledThreadPoolExecutor(1);

exec.scheduleAtFixedRate(new Runnable()

{// 每隔一段时间就触发异常

@Override

public void run()

{

System.out.println("================");

}

}, 1000, 5000, TimeUnit.MILLISECONDS);

exec.scheduleAtFixedRate(new Runnable()

{// 每隔一段时间打印系统时间,证明两者是互不影响的

@Override

public void run()

{

System.out.println(System.nanoTime());

}

}, 1000, 2000, TimeUnit.MILLISECONDS);

}

}

6.3 newFixedThreadPool

public class TestFixedThreadPool

{

public static void main(String[] args)

{

// 多个线程执行,固定大小线程

ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);

MyThread t1 = new MyThread("t1");

MyThread t2 = new MyThread("t2");

MyThread t3 = new MyThread("t3");

MyThread t4 = new MyThread("t4");

fixedThreadPool.execute(t1);

fixedThreadPool.execute(t2);

fixedThreadPool.execute(t3);

fixedThreadPool.execute(t4);

fixedThreadPool.shutdown();

}

}

6.4 newCachedThreadPool

public class TestCachedThreadPool

{

public static void main(String[] args)

{

// 多个线程执行,无线程数量限制.由运行环境的CPU决定

ExecutorService cachedThreadPool = Executors.newCachedThreadPool();

MyThread t1 = new MyThread("t1");

MyThread t2 = new MyThread("t2");

MyThread t3 = new MyThread("t3");

MyThread t4 = new MyThread("t4");

cachedThreadPool.execute(t1);

cachedThreadPool.execute(t2);

cachedThreadPool.execute(t3);

cachedThreadPool.execute(t4);

cachedThreadPool.shutdown();

}

}

6.6 ThreadPoolExecutor

public class TestThreadPoolExecutor

{

public static void main(String[] args)

{

// 通过构造器,创建线程池

ThreadPoolExecutor pool = new ThreadPoolExecutor(2, 3, 30, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());

MyThread t1 = new MyThread("t1");

MyThread t2 = new MyThread("t2");

MyThread t3 = new MyThread("t3");

MyThread t4 = new MyThread("t4");

pool.execute(t1);

pool.execute(t2);

pool.execute(t3);

pool.execute(t4);

pool.shutdown();

}

}

时间: 2024-11-05 16:10:37

java 线程泄之一的相关文章

java 线程详解

5月7号  周末看了一下线程方面的内容 ,边看视频边看书还附带着参考了很多人的博客,一天的收获,写下来整理一下:感觉收获还是挺多的:过段时间可能看完java  这几大块要去看一下关于spring boot  的内容顺便  也整理一下:附上我参考的 几本书: 关于java  线程,首先要了解一下线程和进程之间的关系.区别以及他们之间的概念: 首先是线程: 什么是线程? 线程是在程序执行过程中能够执行部分代码的一个执行单元,也看看做是一个轻量级的进程:线程是程序内的程序控制流只能使用程序内分配给程序

Java线程工作内存与主内存变量交换过程及volatile关键字理解

Java线程工作内存与主内存变量交换过程及volatile关键字理解 1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行.此处的所谓内存模型要区别于通常所说的虚拟机堆模型: 2. 线程独有的工作内存和进程内存(主内存)之间通过8中原子操作来实现,如下图所示: 原子操作的规则(部分): 1) read,load必须连续执行,但是不保证原子性. 2) store,write必须连续执行,但是不保证原子性. 3) 不能丢失变量最后一次ass

java线程

Java线程详解 1.操作系统中的线程和进程讲解: 现在的操作系统大都是多任务操作系统,多线程是多任务的一种. 进程是指操作系统中运行的一个程序,每个进程都有自己的一块内存空间,一个进程中可以启动多个线程. 线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如java.exe进程中可以运行很多线程.线程总是属于某个进程,进程中的多个线程共享进程的内存. “同时”执行是人的感觉,在线程之间实际上轮换执行. Java线程的两种具体实现方法: 第一种继承:具体代码实现如下: Public (

Java 线程第三版 第四章 Thread Notification 读书笔记

一.等待与通知 public final void wait() throws InterruptedException 等待条件的发生. public final void wait(long timeout) throws InterruptedException 等待条件的发生.如果通知没有在timeout指定的时间内发生,它还是会返回. public final void wait(long timeout, int nanos) throws InterruptedException

Java线程使用大全

1.线程实现 1.Thread类 构造方法: 案例代码: public class Ex10_1_CaseThread extends Thread {// 创建一个类继承(extend)Thread类 String studentName; public Ex10_1_CaseThread(String studentName) {// 定义类的构造函数,传递参数 System.out.println(studentName + "申请访问服务器"); this.studentNam

java线程五种状态

java线程五种状态: 创建 -> 就绪 -> 运行 -> 销毁 创建 -> 就绪 -> 运行 -> 等待(缺少资源) -> 销毁 下图:各种状态转换

java线程详细介绍

目录(?)[-] 一扩展javalangThread类 二实现javalangRunnable接口 三Thread和Runnable的区别 四线程状态转换 五线程调度 六常用函数说明 使用方式 为什么要用join方法 七常见线程名词解释 八线程同步 九线程数据传递 本文主要讲了java中多线程的使用方法.线程同步.线程数据传递.线程状态及相应的一些线程函数用法.概述等. 首先讲一下进程和线程的区别: 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1

java 线程通信

java 线程通信使用wait notify 配合synchronized 当线程执行wait()时,会把当前的锁释放,然后让出CPU,进入等待状态.当执行notify/notifyAll方法时,会唤醒一个处于等待该 对象锁 的线程,然后继续往下执行,直到执行完退出对象锁锁住的区域(synchronized修饰的代码块)后再释放锁. 如下代码: public class ThreadTest { //声明一个线程可视化的list集合 public static List<String> lis

分享一个java线程专栏

专栏 : java线程基础 转载自 http://blog.csdn.net/column/details/yinwenjiethread.html 专栏内容: 1.线程基础:线程(1)--操作系统和线程原理 2.线程基础:线程(2)--JAVA中的基本线程操作(上) 3. 线程基础:线程(3)--JAVA中的基本线程操作(中) 4.线程基础:线程(4)--JAVA中的基本线程操作(下) 5.线程基础:线程池(5)--基本使用(上) 6.线程基础:线程池(6)--基本使用(中) 7.线程基础:线