Java 第24天 高级进阶篇 线程池的方式 创建多线程 (六.)

写在前言 : 学习资源B站是最好的也是很全面。
1 、现在出去面试,面试官老是会问你一句话Java 怎么样?
不管是大数据岗位还是数据库都会问一句。 回来痛下决心,决定探索下这门语言的精髓,大数据很多框架也都是Java 写的,的确懂一门语言,比较稳妥。路也宽敞!!!不然就和吃饭没筷子,那么尴尬。把每天学习到的 Java知识分享到这里会。直到能自己写个复杂一点Dome得出来。
2、为了监督自己探索这门语言的动力与决心。特此这段话放到前面!!!
3、挑战下自己 到底是笨 还是学不会,还是不想学。 好运
JDK 5.0 新增方式二:线程池
  • 背景:经常创建和销毁、使用量特别大的资源,比如并发情况下的线程,对性能影响很大。
  • 思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免重复的创建和销毁,实现重复利用。类似于生活中的交通工具。
  • 好处:提高响应速度。(减少了创建新线程的时间)
  • 降低资源消耗(重复利用线程池中的线程,不需要每次都创建)
  • 便于线程管理:
  • corePooleSize:核心池的大小。
  • MaxmumPooleSize:最大线程数
  • KeepAliveTime:线程没有任务时最多保持多长时间会终止。

二:栗子:

package Work_ZQ3;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**

  • 使用线程池的方式
    */

class NumberThread implements Runnable{
@Override
public void run() {
for (int i =0;i<100;i++){
if (i%2 !=0){
// 2!=0
System.out.println(Thread.currentThread().getName()+“当前线程的名字:”+ i );
}
}
}
}
class NumberThread1 implements Runnable{
@Override
public void run() {
for (int i =0;i<100;i++){
if (i%2 ==0){
System.out.println(Thread.currentThread().getName()+“当前线程的名字:”+ i );
}
}
}
}
public class ThreadPool {
public static void main(String[] args) {
// 下面:10是代表10个线程
//1、 指定线程数量的线程池
ExecutorService service = Executors.newFixedThreadPool(10);
ThreadPoolExecutor server1 = (ThreadPoolExecutor) service;
//获取线程池的属性
// System.out.println(service.getClass());
//核心池的大小。
server1.setCorePoolSize(15);
//2、 执行指定的线程的操作。需要提供实现Runnable 接口或callable 接口实现类的对象。
service.execute(new NumberThread());//适合使用于Runnable
service.execute(new NumberThread1());
// service.submit(); //适合使用于callable
//3、关闭线程池
service.shutdown();
}
}

总结:

推荐使用 ThreadPoolExecutor 方式

  • 在阿里的 Java 开发手册时有一条是不推荐使用 Executors 去创建,而是推荐去使用 ThreadPoolExecutor 来创建线程池。

  • 这样做的目的主要原因是:使用 Executors 创建线程池不会传入核心参数,而是采用的默认值,这样的话我们往往会忽略掉里面参数的含义,如果业务场景要求比较苛刻的话,存在资源耗尽的风险;另外采用 ThreadPoolExecutor 的方式可以让我们更加清楚地了解线程池的运行规则,不管是面试还是对技术成长都有莫大的好处。

  • 改了变量,其他线程可以立即知道。保证可见性的方法有以下几种:

  • volatile

  • 加入 volatile 关键字的变量在进行汇编时会多出一个 lock 前缀指令,这个前缀指令相当于一个内存屏障,内存屏障可以保证内存操作的顺序。当声明为 volatile 的变量进行写操作时,那么这个变量需要将数据写到主内存中。

  • 由于处理器会实现缓存一致性协议,所以写到主内存后会导致其他处理器的缓存无效,也就是线程工作内存无效,需要从主内存中重新刷新数据。

面试题:创建多线程有几种方式?

我 :有四种方式 。

面试官:分别是那四种可以说说么:

我: 1、继承Thread类

2、实现Runnable 接口

3、实现callable 接口

4、使用线程池方式

 
 
 

【转载注明出处,还望尊重原创 】

 

【作者水平有限,如有错误欢迎指正 .】

Java 第24天 高级进阶篇 线程池的方式 创建多线程 (六.)_第1张图片

你可能感兴趣的:(Java,基础知识)