当前位置:网站首页>7.28
7.28
2022-07-30 00:13:00 【剑轩~】
线程通信
wait() : 一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。
notify() : 一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,就唤醒优先级高的那个。
notifyAll() : 一旦执行此方法,就会唤醒所有被wait的线程
说明:
wait()、notify()、notifyAll()三个方法必须使用在同步代码块或同步方法中。
三个方法的调用者中必须是同步代码块或同步方法的同步监视器
否则,会出现IllegalMonitorStatteException 异常
面试题:
sleep() 和 wait() 的异同?
相同点:一旦执行方法,都可以使得当前线程进入阻塞状态。
不同点:1.两个方法声明的位置不同:Thread类中声明sleep(),Object类中声明wait()
2.调用的要求不同:sleep()可以在任何需要的场景下调用。wait()必须使用在同步代码块中。
3.关于是否释放同步监视器:如果两个方法都使用在同步代码块或同步方法中,sleep()不释放同步监视器。
方式三:实现Callable接口
与实现Runnable相比:
相比run() 方法,可以有返回值
方法可以抛出异常
支持泛型的返回值
需要借助Future Task 类,比如获取返回结果
方式四:使用线程池
提供指定线程数量的线程池
执行指定的线程的操作,需要提供实现Runnable 接口或Callable接口实现类的对象
关闭连接池
好处:1.提高响应速度(减少了创建新线程的时间)
2.降低资源消耗:重复利用线程池中线程,不需要每次都创建
3.便于线程管理
corePoolSzie() : 核心池的大小
maximunPoolSize:最大线程数
keepAliveTime:线程没有创建任何时最多保持多长时间后会终止
常用类
String
声明为final的,不可被继承
String 实现了Serializable接口 : 表示字符串是支持序列化的
实现了Comparable接口:
内部定义了 final char[] value 用于存储字符串数据,代表不可变的字符序列:不可变性;
通过字面量的方式给一个字符串赋值,此时的字符串值声明在字符串常量池中,字符串常量池不会储存相同内容的字符串。
通过自变量的方式进行赋值,存储的是相同的地址。不管是字面量赋值的,还是new赋值的,其最终指向的都是方法区中的字符串常量池,但new的方式,其对象存的是堆空间中的地址,字面量的方式,直接指向了字符串常量池
class Person{
String name ;
int age ;
}
public class Test{
@Test
public void test() {
Person p1 = new Person("name","10") ;
Person p2 = new Person("name","11");
System.out.println(p1.name==p2.name) ; // true;
}
}
面试题:String s = new String("abc"); 方式创建对象,创建了几个对象?
两个,堆空间一个,方法区一个。
常量与常量的拼接结果是在常量池的。且常量池中不会存在相同内容的常量。
只有其中有一个是变量,结果就在堆中(相当于new了对象)。
如果拼接的结果调用了inturn()方法,返回值就在常量池中。
常用方法
compareTo(); //先的减后的 负数:当前对象小
contains() ; // 包含子串
StringBuffer 和 StringBuilder
三者的异同:
String:不可变的字符序列,底层使用char[];
StringBuffer:可变的字符序列; 线程安全的,效率低。底层使用char[];
StringBuilder:可变的字符序列;线程不安全,效率高;底层使用char[];
append() ; 有返回值。可链式调用
String str = new String() ; // new char[0] ;
String str1 = new String("abc") ; // char[] value = new char[]{'a','b','c'};
StringBuffer sb1 = new StringBuffer() ; // char[] value = new char[16];
sb1.append('a'); // value[0] = 'a' ;
sb2.append('b'); // value[1] = 'b' ;
StringBuffer sb2 = new StringBuffer("abc") ; // char[] value = new char["abc".length()+16] ;
// 扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组;
默认情况下,扩容为原来的2倍+2,同时将原有数组中的元素复制到新的数组中
指导意义:开发中建议使用:StringBuffer(int capacity); // 初始化长度
边栏推荐
猜你喜欢

Low dropout linear regulator MPQ2013A-AEC1 brand MPS domestic replacement

【分层强化学习】survey

外包干了五年,废了...

Douyin short video traffic acquisition strategy, mastering these will definitely be a hit

自媒体短视频标题怎么写?3个爆款标题,让你的视频收获更多流量
![CesiumJS 2022^ 源码解读[0] - 文章目录与源码工程结构](/img/6a/0a446eb00fb73275897cbfb336e0b0.png)
CesiumJS 2022^ 源码解读[0] - 文章目录与源码工程结构

Worthington Enzymatic Cell Harvest & Cell Adhesion and Harvest

EA&UML日拱一卒-状态图::重画按钮状态图

论文精读——YOLOv3: An Incremental Improvement

中文语义匹配
随机推荐
随便记记第二周
Filebeat如何保证在日志文件被切割(或滚动rolling)时依然正确读取文件
Expansion of Parallel I/O Port in Single Chip Microcomputer Development
cp强制覆盖与不覆盖拷贝方法
i.MX6U-driver development-3-new character driver
新媒体运营必备的4个热点查询网
At the age of 29, I was fired from a functional test. Can't find a job after 2 months of interviews?
CesiumJS ^ source read [0] 2022 - article directory and source engineering structure
Worthington用于细胞收获的胰蛋白酶&细胞释放程序
what is a .pro file in qt
每周推荐短视频:研发效能是什么?它可以实现反“内卷”?
读书笔记:《这才是心理学:看穿伪心理学的本质(第10版)》
Mysql internal and external connections
Adaptive feature fusion pyramid network for multi-classes agriculturalpest detection
月薪15k的阿里测试岗,面试原来这么简单
【集训DAY16】KC‘s Can 【动态规划】
“ 我是一名阿里在职9年软件测试工程师,我的经历也许能帮到处于迷茫期的你 ”
c语言小游戏扫雷
种类并查集(反集),学习T宝代码
go语言序列化和反序列化及序列化后的json为空和json的key值大写如何改为小写问题