一个线程对应一个栈和程序计数器;一个进程对应一个方法区和堆。
代码复用, 当有复用的部分或是可以抽取出来为一个功能而模块化的时候,要抽取出来,提高可读性
使用枚举代替一些数字,这样可以方便阅读,同时如果更改数字的时候,不需要更改代码的其他位置。
switch中直接使用枚举的变量名;导包时使用static可省略类名(工具、枚举类);
重写toString的时候,如果直接使用super会造成不一定调用直接父类的情况,可以另建一个方法,来代替super()的使用。同时和这个方法也是public/继承下来的,可以直接调用
数组判空,需要null以及length==0,看具体的情况
创建继承于Thread的子类
重写Thread类的run() ;
创建Thread类的子类的对象
通过此对象调用start() ;两个作用:1.启动当前线程 ; 2. 调用当前线程的run() :
不能通过直接调用run() 方法的方式启动线程
要创建两个线程,必须要有两个对象,而不能是一个对象start() 两次;
yiled() : 释放当前CPU的执行权
join() ; 在线程a中调用线程b的join(),此时线程a进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态
setPriority(int p) ;
getPriority() ;
MAX : 10
MIN : 1
NORM :5
实现Runnable
创建一个实现了Runnable 接口的类
实现类去实现Runnable中的抽象方法 : run()
创建实现类的对象
将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
通过Thread类的对象调用start();
优先选择 : 实现Runnable接口的方式
实现的方式没有类的单继承性的局限性。
实现的方式更适合来处理多个线程共享数据的情况
联系:Thread 类 也实现了Runable 接口
相同点:两种方式都需要重写run()
synchronized(同步监视器) {
// 需要被同步的代码
};
说明:操作共享数据的代码,即为需要被同步的代码
共享数据:多个线程共同操作的变量。
同步监视器:俗称,锁;任何一个类的对象,都可以充当锁;
要求:多个线程必须要共同用一把锁
补充:
在实现Runnable接口创建多线程的方式中,我们可以考虑使用this来充当同步监视器
在继承Threaad类创建多线程的方式中,慎用this充当同步监视器,考虑使用当前类充当同步监视器
使用同步方法解决继承Thread类的方式的线程安全问题
同步方法仍然涉及到同步监视器,只是不需要我们显式的声明。
非静态的同步方法,同步监视器是 : this
静态的同步方法,同步监视器是 当前类本身
先创建一个 ReentrantLock
lock.lock() ;
lock.unlock() ;
synchronized 与 lock 的异同?
相同:二者都可以解决线程安全问题
不同:synchronized 机制在执行完相应的同步代码以后,自动的释放同步监视器
Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock())
优先使用顺序:Lock --> 同步代码块(已经进入了方法体,分配了相应的资源) --> 同步方法(在方法体之外)
「艾尔登法环」梅琳娜手办开订 立体手办▪
万代「艾尔登法环」白狼战鬼手办开订 立体手办▪
「夏目友人帐」猫咪老师粘土人开订 立体手办▪
「五等分的新娘∬」中野三玖·白无垢版手办开订 立体手办▪
「海贼王」乌索普Q版手办开订 立体手办▪
良笑社「初音未来」新手办开订 立体手办▪
「黑岩射手DAWN FALL」死亡主宰手办开订 立体手办▪
「盾之勇者成名录」菲洛手办登场 立体手办▪
「魔法少女小圆」美树沙耶香手办开订 立体手办▪
「咒术回战」七海建人粘土人登场 立体手办▪
「五等分的新娘」中野二乃白无垢手办开订 立体手办▪
「为美好的世界献上祝福!」芸芸粘土人开订 立体手办▪
「公主连结 与你重逢」六星可可萝手办开订 立体手办▪
「女神异闻录5」Joker雨宫莲手办开订 立体手办▪
「间谍过家家」约尔・福杰粘土人登场 立体手办▪
「街角魔族 2丁目」吉田优子手办开订 立体手办▪
「火影忍者 疾风传」旗木卡卡西·暗部版粘土人登场 立体手办▪
「佐佐木与宫野」宫野由美粘土人开订 立体手办▪
「盾之勇者成名录」第2季拉芙塔莉雅手办开订 立体手办▪
「咒术回战」两面宿傩Q版坐姿手办开订 立体手办▪
「DATE·A·BULLET」时崎狂三手办开订 立体手办▪
「狂赌之渊××」早乙女芽亚里粘土人开订 立体手办▪
「魔道祖师」魏无羨粘土人开订 立体手办▪
「新·奥特曼」奥特曼手办现已开订 立体手办▪