线程和线程池的使用

Posted 从零学java开发

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程和线程池的使用相关的知识,希望对你有一定的参考价值。

Java多线程
作为一门开发语言,多线程一定是伴随始终的概念,为了高效的利用cpu的资源,让cpu的多核能够得到充分的利用,多线程是必须要了解的内容。
先创建一个线程--普通继承版
public class ThreadDemo { public static void main(String[] args) { //这里是主线程 MyThread myThread = new MyThread(); //创建线程 Thread thread = new Thread(myThread); //开启线程 thread.start(); //从这里开始主线程 // 和mythread子线程同时运行 // 2个线程各自执行自己的,互不干扰 for (int i = 0 ; i < 100 ; i++)     System.out.println(Thread.currentThread().getName() + "main主线程运行");  }}class MyThread implements Runnable{  @Override  public void run() {   for (int i = 0 ; i < 100 ; i++){   System.out.println(Thread.currentThread().getName() + "mythread子线程运行");    }  } }
匿名内部类版
public class RunnableDemo { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 100 ; i++) System.out.println(Thread.currentThread().getName() + "mythread子线程运行");       }}).start();       //从这里开始,2个线程同时执行       for (int i = 0 ; i < 100 ; i++)        System.out.println(Thread.currentThread().getName() + "main主线程运行");   } }
lambda表达式版
public static void main(String[] args) { new Thread(() -> { for (int i = 0 ; i < 100 ; i++) System.out.println(Thread.currentThread().getName() + "mythread子线程运行");    }).start();    //从这里开始,2个线程同时执行    for (int i = 0 ; i < 100 ; i++)      System.out.println(Thread.currentThread().getName() + "main主线程运行");}
Java线程池
刚才我们聊到如何创建线程,怎么让任务分配到不同线程中去并行工作,让代码同步执行。但是每次创建线程,用完一次就销毁了,这样是不是很蠢,创建的线程变成一次性的了,我们不想这样,我们想创建的线程,执行完任务代码以后不会立刻销毁线程,而是一直在那,下次可以继续使用。
这就是 线程池
java给我们提供了多个线程池使用
public class ThreadPoolDemo { public static void main(String[] args) { //核心线程数 int corePoolSize = 5; //最大线程数 int maxPoolSize = 10; //空闲线程存活时间 int keepAliveTime = 60; //存活时间的单位 TimeUnit unit = TimeUnit.SECONDS; //阻塞队列 BlockingQueue blockQueue = new LinkedBlockingQueue<Runnable>(); //拒绝策略 ThreadPoolExecutor.AbortPolicy abortPolicy = new ThreadPoolExecutor.AbortPolicy(); ThreadPoolExecutor threadPool = new ThreadPoolExecutor (corePoolSize, maxPoolSize, keepAliveTime, unit, blockQueue, abortPolicy);        //把任务加进线程池,并执行任务执行任务 threadPool.execute(new MyThread()); } static class MyThread implements Runnable{ @Override public void run() { for (int i = 0 ; i < 100 ; i++) System.out.println(Thread.currentThread().getName() + "mythread子线程运行"); } }}
线程池的excute()方法就是把线程对象放入线程池中并执行,我们可以一直往线程池中放入线程任务,这样就会导致线程池中的任务过多,这时就会创建新的线程直到达到核心线程数(corePoolSize),核心线程是一直存在的,如果继续增加任务,核心线程数不够的时候,还会创建线程,直到最大线程数(maxPoolSize),如果这时候线程还不够,就会把任务放到阻塞队列中(blockQueue),如果阻塞队列是无界,直到放到内存溢出为止,如果阻塞队列是有界的,当阻塞队列放不下时,就会执行拒绝策略(比如直接抛一个异常,告诉你放不下了)。当线程慢慢闲下来的时候,空闲线程空闲时间超过设置的时间(keepAliveTime),就会销毁线程,直到达到核心线程数(corePoolSize)。如果设置了
threadPool.allowCoreThreadTimeOut(true);
查过设置时间,也会销毁核心线程数。TimeUnit是keepAliveTime的单位。
java
编程

以上是关于线程和线程池的使用的主要内容,如果未能解决你的问题,请参考以下文章

Java——线程池

Java线程池详解

Java线程池详解

Java 线程池详解

线程池的使用场景和代码实现!

Java多线程-线程池的使用与线程总结(狂神说含代码)