学习Java必备的基础知识打卡12.14,要想学好必须扎实基本功(?建议收藏)#yyds干货盘点#

休言女子非英物,夜夜龙泉壁上鸣。这篇文章主要讲述学习Java必备的基础知识打卡12.14,要想学好必须扎实基本功(?建议收藏)#yyds干货盘点#相关的知识,希望能为你提供帮助。
Day20-java@[toc]
关于作者? 作者介绍
线程池就是多个线程封装在一起操作。
线程池概念
【学习Java必备的基础知识打卡12.14,要想学好必须扎实基本功(?建议收藏)#yyds干货盘点#】在生活中经常遇见,今天开发一个项目需要20个人一起开发

  • 这个活很大,有多少人要多少人
  • 这个活很大,但是要求10个人
  • 这个活很大,但只要求1个人做
学习Java必备的基础知识打卡12.14,要想学好必须扎实基本功(?建议收藏)#yyds干货盘点#

文章图片

追加一个并发访问的程序报:java.util.concurrent,对于此线程池的操作的核心类和接口就定义在之中。这里面有两个核心的接口:
  1. 普通的执行线程池定义:Interface ExecutorService
  2. 调度线程池:InterfaceScheduledExecutorService
如果要进行线程池的创建一般使用Class Executors这个类
  • 创建无法小限制的线程池:public static ExecutorService newCachedThreadPool()
  • 创建固定大小的线程池:public static ExecutorService newFixedThreadPool(int nThreads)
  • 单线程池:public static ExecutorService newSingleThreadExecutor()
  • 创建定时调度池:public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
线程池的实现
package com.day13.demo; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class PoolDemo1 public static void main(String[] args) throws Exception // TODO Auto-generated method stub //创建了一个线程池的模型,但是后面没有线程 ExecutorService executorService = Executors.newCachedThreadPool(); for (int i = 0; i < 10; i++) int index = i; Thread.sleep(200); executorService.submit(()-> System.out.println(Thread.currentThread().getName() + ",i = " + index); ); executorService.shutdown();

package com.day13.demo; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class PoolDemo1 public static void main(String[] args) throws Exception // TODO Auto-generated method stub //创建了一个线程池的模型,但是后面没有线程 ExecutorService executorService = Executors.newFixedThreadPool(3); for (int i = 0; i < 10; i++) int index = i; Thread.sleep(200); executorService.submit(()-> System.out.println(Thread.currentThread().getName() + ",i = " + index); ); executorService.shutdown();

package com.day13.demo; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class PoolDemo1 public static void main(String[] args) throws Exception // TODO Auto-generated method stub //创建了一个线程池的模型,但是后面没有线程 ExecutorService executorService = Executors.newSingleThreadExecutor(); for (int i = 0; i < 10; i++) int index = i; executorService.submit(()-> System.out.println(Thread.currentThread().getName() + ",i = " + index); ); executorService.shutdown();

package com.day13.demo; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class PoolDemo1 public static void main(String[] args) throws Exception // TODO Auto-generated method stub //创建了一哥具备有三个线程大小的定时调度池 ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1); for (int i = 0; i < 10; i++) //Thread.sleep(200); int index = i; executorService.scheduleAtFixedRate(new Runnable() @Override public void run() // TODO Auto-generated method stub System.out.println(Thread.currentThread().getName() + ",i = " + index); , 3, 2, TimeUnit.SECONDS); //使用的是一个秒的单位,表示3秒后开始执行,而后每过2秒执行一次

线程池给我们开发者带来唯一好处的就是允许多个线程按照组的模式进行程序的处理,这样在一个业务逻辑非常复杂的情况下,性能就会得到很好的提升。
StringBuffer类对于类库的学习,不可能全学完。你所需要知道就是如何面对解决问题的方法。要学会查询文档。
StringBuffer类之前首先来简单回顾一下String类的特点:
?String类的对象有两种实例化方式,一种是直接赋值,只会开辟一块堆内存空间,而且对象可以自动入池,另外一种方式使用构造方法完成,会开辟两块空间,有一块空间将称为垃圾,并且不会自动入池,但是可以通过intern()方法手工入池;
?字符串常亮一旦声明则不能改变,而字符串对象可以改变,但是改变的是其内存地址的指向;
通过以上的几个特点就可以清楚的发现,String类是表示字符串使用最多的类,但是其不合适于被频繁修改的字符串操作上,所以在这种情况下,往往可以使用StringBuffer类,即:StringBuffer类方便用户进行内容的修改,在String类之中使用“+”作为数据库的连接操作,而在StringBuffer类之中使用append()方法进行数据的连接。
package com.day13.demo; public class BufferDemo public static void main(String[] args) StringBuffer buf = new StringBuffer(); buf.append("hello").append(",world!"); fun(buf); //修改了buf的内容 System.out.println(buf); public static void fun(StringBuffer tem) tem.append("\\n").append("zsr");

String和StringBuffer最大的区别就是:String的内容无法修改,而StringBuffer的内容可以修改。但是在开发的选择还是优先选择String类。
现在学习的字符串的操作类就有两个了:String,StringBuffer,那么下面通过这两个类的定义来研究一下关系:
String类: StringBuffer类:
public final class String < br /> extends Object < br /> implements Serializable,Comparable< String> ,CharSequence public final class StringBuffer < br /> extends Object < br /> implements Serializable, CharSequence
可以发现两个类都是“CharSequence”接口的子类。这个接口描述的是字符集,所以串就属于字符集的子类,如果以后看见CharSequence最简单的联想就是字符串。但是有一个小小的问题需要注意一下就是String和StringBuffer两个类型无法直接转换。
利用StringBuffer:利用StringBuffer构造方法、append()方法
1.直接利用StringBuffer类的构造方法,public StringBuffer(String str)
package com.day13.demo; public class BufferTest public static void main(String[] args) throws Exception String str = "Hello World."; StringBuffer buf = new StringBuffer(str); fun(buf); System.out.println(buf); private static void fun(StringBuffer temp) temp.append("\\n").append("zsr");

2.利用StringBuffer类的append()方法
package com.day13.demo; public class BufferTest public static void main(String[] args) throws Exception String str = "Hello World."; StringBuffer buf = new StringBuffer(); buf.append(str); fun(buf); System.out.println(sb); private static void fun(StringBuffer temp) temp.append("\\n").append("zsr");

package com.day13.demo; public class BufferTest public static void main(String[] args) throws Exception StringBuffer buf = new StringBuffer("hello,World!"); String str = buf.toString(); System.out.println(str);

实际上StringBuffer还是有一些String类所没有的特点的。
package com.day13.demo; public class BufferTest public static void main(String[] args) throws Exception StringBuffer buf = new StringBuffer("hello,World!"); System.out.println(buf.reverse());

package com.day13.demo; public class BufferDemo public static void main(String[] args) StringBuffer buf = new StringBuffer("Hello,World!"); System.out.println(buf.delete(5, 11));

package com.day13.demo; public class BufferDemo public static void main(String[] args) StringBuffer buf = new StringBuffer("Hello,World!"); System.out.println(buf.delete(5,11).insert(0, "你好,"));

面试题:请解释String、StringBuffer、StringBuilder的区别?
  • String的内容不可以修改,StringBuffer与StringBuilder内容可以修改
  • StringBuffer采用同步处理属于线程安全操作,StringBuilder采用异步处理属于线程不安全操作。

    推荐阅读