休言女子非英物,夜夜龙泉壁上鸣。这篇文章主要讲述学习Java必备的基础知识打卡12.14,要想学好必须扎实基本功(?建议收藏)#yyds干货盘点#相关的知识,希望能为你提供帮助。
Day20-java@[toc]
关于作者? 作者介绍
线程池就是多个线程封装在一起操作。
线程池概念
【学习Java必备的基础知识打卡12.14,要想学好必须扎实基本功(?建议收藏)#yyds干货盘点#】在生活中经常遇见,今天开发一个项目需要20个人一起开发
- 这个活很大,有多少人要多少人
- 这个活很大,但是要求10个人
- 这个活很大,但只要求1个人做
文章图片
追加一个并发访问的程序报:java.util.concurrent,对于此线程池的操作的核心类和接口就定义在之中。这里面有两个核心的接口:
- 普通的执行线程池定义:Interface ExecutorService
- 调度线程池:InterfaceScheduledExecutorService
- 创建无法小限制的线程池: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 |
利用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采用异步处理属于线程不安全操作。
推荐阅读
- #yyds干货盘点#面试篇(虚拟机栈5连问,一听心里就乐了)
- Flutter 专题34 图解自定义 View 之 Canvas#yyds干货盘点#
- Docker的网络隔离和通信
- #私藏项目实操分享#SpringCloud技术专题「Gateway网关系列」微服务网关服务的Gateway组件的原理介绍分析
- 第11篇-认识Stub与StubQueue
- 老王读Spring IoC-5Spring IoC 小结——控制反转依赖注入
- Locust如何测试物联网MQTT
- #yyds干货盘点#JavaSE系列Java程序的封装——Java方法重载及递归
- #yyds干货盘点#Java面试经典100问