多執行緒學習筆記(狂神說視訊8-14)
阿新 • • 發佈:2020-08-24
靜態代理
//結婚的介面 interface Marry{ void happyMarry(); } //真實角色,你去結婚 class You implements Marry{ public void happyMarry() { System.out.println("你結婚了!!!"); } } //代理角色,幫助你結婚 class WeddingCompany implements Marry{ private Marry target; public WeddingCompany(Marry target) { this.target = target; } public void happyMarry() { before(); this.target.happyMarry();//這就是真實角色 after(); } private void before() { System.out.println("結婚之前佈置現場"); } private void after() { System.out.println("結婚之後收拾現場"); } } public class StaticProxy{ public static void main(String[] args) { new WeddingCompany(new You()).happyMarry(); } }
執行結果
總結
真實物件和代理物件都要實現同一個介面,代理物件要代理真實角色,
代理物件可以做到真實物件做不了的事情,真實物件可以專注做自己的事情。
Lambda表示式
任何介面,如果只包含唯一一個抽象方法,那麼他就是一個函式式介面。(我們就可以用lambda表示式了)
推導lambda表示式
//定義一個函式式介面 interface ILike{ void lambda(); } //1.實現類 class Like1 implements ILike{ @Override public void lambda() { System.out.println("I like lambda1"); } } public class TestLambda { //2.靜態內部類 static class Like2 implements ILike{ @Override public void lambda() { System.out.println("I like lambda2"); } } public static void main(String[] args) { ILike like1 = new Like1(); like1.lambda(); ILike like2 = new Like2(); like2.lambda(); //3.區域性內部類 class Like3 implements ILike{ @Override public void lambda() { System.out.println("I like lambda3"); } } ILike like3 = new Like3(); like3.lambda(); //4.匿名內部類,沒有類的名稱必須藉助介面或者父類 ILike like4 = new ILike() { @Override public void lambda() { System.out.println("I like lambda4"); } }; like4.lambda(); //5.用lambda簡化 ILike like5 = ()-> System.out.println("I like lambda5"); like5.lambda(); } }
執行結果
執行緒停止
測試stop
- 建議執行緒正常停止,利用次數,不建議死迴圈
- 建議使用標誌位,設定一個標誌位
- 不要使用stop或者destroy等過時或者JDK不建議使用的方法
public class TestStop implements Runnable{ //設定一個標識位 private boolean flag = true; @Override public void run() { int i=0; while(flag) { System.out.println("run...Thread"+i++); } } //2.設定一個公開的方法停止執行緒,轉換標誌位 public void stop() { this.flag = false; } public static void main(String[] args) { // TODO Auto-generated method stub TestStop t = new TestStop(); new Thread(t).start(); for(int i=0;i<1000;i++) { System.out.println("Main"+i); if(i==900) { //呼叫我們自己的stop方法,讓執行緒停止 t.stop(); System.out.println("執行緒停止了"); } } } }
執行緒休眠
public class TestSleep{
public static void main(String[] args) throws InterruptedException {
int num = 10;
while (num>0){
Thread.sleep(1000);
System.out.println(num);
num--;
}
}
}
執行緒禮讓
- 禮讓執行緒,讓當前正在執行的執行緒暫停,但不阻塞
- 將執行緒從執行狀態轉為就緒狀態
- 讓CPU重新排程,禮讓不一定成功,看CPU心情
public class TestYield {
public static void main(String[] args) {
MyYield myYield = new MyYield();
new Thread(myYield,"a執行緒").start();
new Thread(myYield,"b執行緒").start();
}
}
class MyYield implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"執行第一次");
Thread.yield();//執行緒開始禮讓
System.out.println(Thread.currentThread().getName()+"執行第二次");
}
}
執行結果
執行緒強制執行
- Join合併執行緒,待此執行緒執行完成後,再執行其他執行緒,其他執行緒阻塞
- 可以想象成插隊
public class TestJoin implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println("執行緒vip來了");
}
}
public static void main(String[] args) throws InterruptedException {
TestJoin testJoin = new TestJoin();
Thread thread = new Thread(testJoin);
thread.start();
//主執行緒
for (int i = 0; i < 100; i++) {
System.out.println("主執行緒執行"+i);
if (i == 50){
thread.join();
}
}
}
}