Java自學-多執行緒(1)
阿新 • • 發佈:2021-08-09
Java自學-多執行緒(1)
1、初識併發問題
2、龜兔賽跑
package lesson01; /** * Author: Gu Jiakai * Date: 2021/8/9 9:48 * FileName: Race * Description: */ //模擬龜兔賽跑 public class Race implements Runnable { private static String winner;//勝利者。 @Override public void run() { for (int i = 0; i <= 100; i++) { //模擬兔子是否休息。 if(Thread.currentThread().getName().equals("兔子")&&i%10==0){ try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } //判斷比賽是否結束。 boolean flag=gameOver(i); //如果比賽結束了。 if(flag){ break; } System.out.println(Thread.currentThread().getName()+"-->跑了"+i+"步!"); } } //判斷是否完成比賽 private boolean gameOver(int steps){ //判斷是否有勝利者。 if(winner!=null){//已經有勝利者。 return true; } if(steps>=100){ winner=Thread.currentThread().getName(); System.out.println("winner is "+winner); return true; } return false; } public static void main(String[] args) { Race race = new Race(); new Thread(race,"兔子").start(); new Thread(race,"烏龜").start(); } }
3、實現Callable介面
4、靜態代理模式
package lesson02; /** * Author: Gu Jiakai * Date: 2021/8/9 11:05 * FileName: StaticProxy * Description: */ //靜態代理模式總結: //真實物件和代理物件都要實現同一個介面 //代理物件要代理真實角色 // 好處: //代理物件可以做很多真實物件做不了的事情 //真實物件專注做自己的事情 public class StaticProxy { public static void main(String[] args) { Wedding wedding = new Wedding(new You()); wedding.HappyMarry(); } } interface Mary{ void HappyMarry(); } //真實角色,你去結婚 class You implements Mary{ @Override public void HappyMarry() { System.out.println("小明要結婚了,超開心!"); } } //代理角色,幫助你結婚 class Wedding implements Mary{ private Mary target; public Wedding(Mary target) { this.target = target; } @Override public void HappyMarry() { before(); this.target.HappyMarry();//真實物件結婚 after(); } private void before() { System.out.println("結婚之前,佈置現場!"); } private void after() { System.out.println("結婚之後,收尾款!"); } }
5、Lambda表示式
package lesson02; /** * Author: Gu Jiakai * Date: 2021/8/9 11:29 * FileName: TestLambda1 * Description: */ /* * 推導Lambda表示式 * */ public class TestLambda1 { //靜態內部類 static class Like2 implements ILike{ @Override public void lambda() { System.out.println("I like Lambda2!"); } } public static void main(String[] args) { ILike like =new Like(); like.lambda(); like=new Like2(); like.lambda(); // 4、區域性內部類。 class Like3 implements ILike{ @Override public void lambda() { System.out.println("I like Lambda3!"); } } like=new Like3(); like.lambda(); //5、匿名內部類。沒有類的名稱,必須藉助介面或者父類。 like=new ILike() { @Override public void lambda() { System.out.println("I like Lambda4!"); } }; like.lambda(); //6、用lambda簡化 like=()->{System.out.println("I like Lambda5!");}; like.lambda(); } } //1、定義一個函式式介面 interface ILike{ void lambda(); } class Like implements ILike{ @Override public void lambda() { System.out.println("I like Lambda!"); } }
package lesson02;
/**
* Author: Gu Jiakai
* Date: 2021/8/9 15:30
* FileName: TestLambda2
* Description:
*/
public class TestLambda2 {
public static void main(String[] args) {
// Lambda表示式簡化。
// Ilove love=(int a)->{System.out.println("I love you-->!"+a);};
// 簡化1:去掉引數型別。
// Ilove love=(a)->{System.out.println("I love you-->!"+a);};
// love.love(520);
// 簡化2:去掉括號。
// Ilove love=a->{System.out.println("I love you-->!"+a);};
// love.love(521);
//簡化3:去掉花括號
Ilove love=(a,b)->System.out.println("I love you-->!"+a+b);;
love.love(521,502);
//總結:
//lambda表示式只能有一行程式碼的情況下才能簡化成為一行,如果有多行,那麼就用程式碼塊包裹。
// 前提是介面為函式式介面
//多個引數也可以去掉引數型別,要去掉就都去掉,必須加上括號,
}
}
interface Ilove{
void love(int a,int b);
}