easyUI datagrid view擴充套件
阿新 • • 發佈:2020-10-07
多執行緒知識點
--多執行緒基礎—(執行緒小案例)
建立執行緒-Thread
1.建立執行緒TestThread1 觀察主執行緒和run執行緒體的執行結果 (順序)
//建立執行緒方式1:繼承Thread類,重寫run()方法,呼叫start開啟執行緒 //總結:注意,執行緒開啟不一定立即執行,由CPU排程執行 public class TestThread1 extends Thread { @Override public void run() { //run方法執行緒體 for (int i = 0; i < 200; i++) { System.out.println("我在圖書館---"+i); } } public static void main(String[] args) { //main執行緒 -主執行緒 //建立一個執行緒物件 TestThread1 testThread1=new TestThread1(); //呼叫start()方法 開啟執行緒 //此時這裡是start方法 使主執行緒main和run方法執行緒體同時進行 //如果把start換成run方法 則會先執行完run()再執行main主方法 testThread1.start(); for (int i = 0; i < 1000; i++) { System.out.println("我在學習多執行緒--"+i); } } }
2.建立執行緒TestThread2 觀察T1 T2 T3 三個順序執行但不順序執行
(按照方法 理應先執行t1 然後是t2 t3) 但執行結果每次都不一樣 所以執行緒的執行順序不一樣的)
此案例需要匯入lib jar包 下載地址:
http://commons.apache.org/proper/commons-io/download_io.cgi
package com.gao; import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.net.URL; //練習Thread,實現多執行緒同步下載多個圖片 public class TetsThread2 extends Thread { private String url;//圖片地址 private String name;//圖片名稱 public TetsThread2(String url,String name){ this.url=url; this.name=name; } //下載圖片執行緒的執行體 public void run(){ webDownloader webDownloader=new webDownloader(); webDownloader.downloader(url,name); System.out.println("下載了檔名為"+name); } public static void main(String[] args) { TetsThread2 t1=new TetsThread2("https://uploadfiles.nowcoder.com/images/20190422/392538858_1555913364515_1DFB6E348B5F86DDF063259779AECF89","1.jpg"); TetsThread2 t2=new TetsThread2("https://uploadfiles.nowcoder.com/images/20190422/392538858_1555913378487_493AF0131422EB9655B98CF0AB9D5244","2.jpg"); TetsThread2 t3=new TetsThread2("https://uploadfiles.nowcoder.com/files/20200326/548380650_1585215809223_php.png","3.jpg"); t1.start(); t2.start(); t3.start(); } //下載器 class webDownloader{ public void downloader(String url,String name){ try { FileUtils.copyURLToFile(new URL(url),new File(name)); } catch (IOException e) { e.printStackTrace(); System.out.println("IO異常,downloader方法出錯"); } } } }
3.模擬線上搶票問題
package com.gao; //模擬線上搶票 //發現問題:多個執行緒操作同一資源的情況下,執行緒不安全,資料紊亂 public class TestThread4 implements Runnable { //總票數 private int ticknumber =10; public void run(){ while (true){ if (ticknumber<=0){ break; } try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"-->拿到了"+ticknumber--+"張票"); } } public static void main(String[] args) { TestThread4 ticket=new TestThread4(); new Thread(ticket,"小明").start(); new Thread(ticket,"小王").start(); new Thread(ticket,"小紅").start(); } }
4.模擬龜兔賽跑案例
package com.gao;
//模擬龜兔賽跑
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(10);
} 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();
}
}
靜態模式代理(結婚案例)
package com.gao.demo2;
//靜態代理模式總結:
//真實物件和代理物件都要實現同一個介面
//代理物件需要代理真實角色
//好處:代理物件可以做很多真實物件做不了的事情
//真實物件專注做自己的事情
public class StacticProxy {
public static void main(String[] args) {
new Thread(()-> System.out.println("I love You ")).start();
new weddingCompany(new you()).HappyMarry();
you you=new you();//你要結婚
weddingCompany weddingCompany=new weddingCompany(new you());
weddingCompany.HappyMarry();
}
}
interface Marry{
void HappyMarry();
}
//真實角色
class you implements Marry{
@Override
public void HappyMarry() {
System.out.println("Get married so Happy");
}
}
//代理角色 幫你結婚
class weddingCompany implements Marry{
//代理-->真實目標角色
private Marry target;
public weddingCompany(Marry target) {
this.target = target;
}
@Override
public void HappyMarry() {
before();
this.target.HappyMarry();//這就是真實物件
after();
}
private void after() {
System.out.println("結婚之後,收尾款");
}
private void before() {
System.out.println("結婚之前 佈置現場");
}
}
lamda 表示式
1.推導lamda表示式(從靜態內部類 區域性內部類 匿名內部類 簡化到lamda表示式)
package com.gao.lamda;
/*
推導lamda表示式
*/
public class Testlamda1 {
//3.靜態內部類
static class Like2 implements Ilike{
@Override
public void lambda() {
System.out.println("I like lamda2");
}
}
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 lamda3");
}
}
like=new Like3();
like.lambda();
//5.匿名內部類,沒有類的名稱,必須藉助介面或父類
like=new Ilike() {
@Override
public void lambda() {
System.out.println("i like lamda4");
}
};
like.lambda();
//6.用lamda簡化
like=()->{
System.out.println("i like lamda 5");
};
like.lambda();
}
}
//1.定義一個函式介面
interface Ilike{
void lambda();
}
//2.定義實現類
class like implements Ilike{
@Override
public void lambda() {
System.out.println("I like lamda");
}
}
-
lamda表示式的從複雜到最簡的簡化過程
總結:/總結 //lamda表示式 只能有一行程式碼的情況才能簡化成一行, //如果多行只能用程式碼塊包裹 //前提還得介面必須是函式式介面(介面內只有一個方法)(此案例 介面Ilove內只有一個方法love)
package com.gao.lamda; public class Testlamda2 { public static void main(String[] args) { //1.lamda 表示簡化 Ilove love=(int a) ->{ System.out.println(" i love you " +a); }; //簡化1.去掉了引數型別 love=(a)-> { System.out.println(" i love you " + a); }; //簡化2.簡化括號 love=a-> { System.out.println(" i love you " + a); }; //簡化3.簡化花括號 love=a -> System.out.println("i love you -"+a); //總結 //lamda表示式 只能有一行程式碼的情況才能簡化成一行, //如果多行只能用程式碼塊包裹 //前提還得介面必須是函式式介面(介面內只有一個方法)(此案例 介面Ilove內只有一個方法love) love.love(520); } } interface Ilove{ void love(int a); }
--多執行緒和高併發高階
第一節 執行緒的基本概念
三種執行緒方法
- sleep ,意思就是睡眠 ,當前執行緒暫停一段時間讓給別的執行緒去執行,sleep是由睡眠時間而定,等規定的時間到了自動復活
- Yield 就是當前執行緒正在執行的時候停止下來進入等待佇列 ,回到等待佇列裡在系統的排程演算法裡呢 還是依然可能把你剛回去的這個執行緒拿回來繼續執行,意思就是我讓出來一下CPU,後面排程能不能搶到就不管了。
- join 意思就是在自己當前執行緒加入你呼叫的執行緒(),本執行緒等待。等呼叫的執行緒執行完 自己再去執行。例如:ti和t2兩個執行緒,在t1的某個點上呼叫了t2.join,它會跑到t2上去執行 ,t1等t2執行完後,t1和t2併成為一條線再去執行(自己 jion 自己 沒意義)
執行緒狀態
常見的執行緒狀態有六種:
當我們new一個執行緒時,還沒呼叫start()該執行緒 處於 新建狀態
執行緒呼叫start()方法時 它會被執行緒排程器執行,也就是交給作業系統執行,這整個狀態就叫Runnable 內部有(1)Ready就緒狀態/(2)Running執行狀態
如果執行緒順利執行完了就會進入(3)Teminated結束狀態,
在Runnable 這個人狀態裡還有一些狀態的變遷 (4)TimedWaiting等待、(5)Waiting等待、(6)Blocked阻塞。
synchronized鎖
-
synchronized鎖的是物件 並不是鎖的程式碼 這一點一定要搞清楚