一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 運用示例詳細總結(jié)Java多線程

運用示例詳細總結(jié)Java多線程

2021-11-23 14:21Java團長 Java教程

本文主要講解了Java多線程,該篇幅大量使用代碼以及圖片文字進行解析,可以讓小伙伴們了解該方面的知識更加迅速快捷

進程與線程

進程是程序的一次動態(tài)執(zhí)行過程,它需要經(jīng)歷從代碼加載,代碼執(zhí)行到執(zhí)行完畢的一個完整的過程,這個過程也是進程本身從產(chǎn)生,發(fā)展到最終消亡的過程。多進程操作系統(tǒng)能同時達運行多個進程(程序),由于 CPU 具備分時機制,所以每個進程都能循環(huán)獲得自己的CPU 時間片。由于 CPU 執(zhí)行速度非常快,使得所有程序好像是在同時運行一樣。

多線程是實現(xiàn)并發(fā)機制的一種有效手段。進程和線程一樣,都是實現(xiàn)并發(fā)的一個基本單位。線程是比進程更小的執(zhí)行單位,線程是進程的基礎(chǔ)之上進行進一步的劃分。所謂多線程是指一個進程在執(zhí)行過程中可以產(chǎn)生多個更小的程序單元,這些更小的單元稱為線程,這些線程可以同時存在,同時運行,一個進程可能包含多個同時執(zhí)行的線程。進程與線程的區(qū)別如圖所示:

運用示例詳細總結(jié)Java多線程

Java中線程實現(xiàn)的方式

在 Java 中實現(xiàn)多線程有兩種手段,一種是繼承 Thread 類,另一種就是實現(xiàn) Runnable 接口。下面我們就分別來介紹這兩種方式的使用。

實現(xiàn) Runnable 接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package ljz;
class MyThread implements Runnable{ // 實現(xiàn)Runnable接口,作為線程的實現(xiàn)類
    private String name ;       // 表示線程的名稱
    public MyThread(String name){
        this.name = name ;      // 通過構(gòu)造方法配置name屬性
    }
    public void run(){  // 覆寫run()方法,作為線程 的操作主體
        for(int i=0;i<10;i++){
            System.out.println(name + "運行,i = " + i) ;
        }
    }
};
public class RunnableDemo01{
    public static void main(String args[]){
        MyThread mt1 = new MyThread("線程A ") ;    // 實例化對象
        MyThread mt2 = new MyThread("線程B ") ;    // 實例化對象
        Thread t1 = new Thread(mt1) ;       // 實例化Thread類對象
        Thread t2 = new Thread(mt2) ;       // 實例化Thread類對象
        t1.start() ;    // 啟動多線程
        t2.start() ;    // 啟動多線程
    }
};

程序運行結(jié)果:

運用示例詳細總結(jié)Java多線程

繼承 Thread 類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyThread extends Thread{  // 繼承Thread類,作為線程的實現(xiàn)類
    private String name ;       // 表示線程的名稱
    public MyThread(String name){
        this.name = name ;      // 通過構(gòu)造方法配置name屬性
    }
    public void run(){  // 覆寫run()方法,作為線程 的操作主體
        for(int i=0;i<10;i++){
            System.out.println(name + "運行,i = " + i) ;
        }
    }
};
public class ThreadDemo02{
    public static void main(String args[]){
        MyThread mt1 = new MyThread("線程A ") ;    // 實例化對象
        MyThread mt2 = new MyThread("線程B ") ;    // 實例化對象
        mt1.start() ;   // 調(diào)用線程主體
        mt2.start() ;   // 調(diào)用線程主體
    }
};

程序運行結(jié)果:

運用示例詳細總結(jié)Java多線程運用示例詳細總結(jié)Java多線程?

從程序可以看出,現(xiàn)在的兩個線程對象是交錯運行的,哪個線程對象搶到了 CPU 資源,哪個線程就可以運行,所以程序每次的運行結(jié)果肯定是不一樣的,在線程啟動雖然調(diào)用的是 start() 方法,但實際上調(diào)用的卻是 run() 方法定義的主體。

Thread 類和 Runnable 接口

通過 Thread 類和 Runable 接口都可以實現(xiàn)多線程,那么兩者有哪些聯(lián)系和區(qū)別呢?下面我們觀察 Thread 類的定義。

?
1
public class Thread extends Object implements Runnable

從 Thread 類的定義可以清楚的發(fā)現(xiàn),Thread 類也是 Runnable 接口的子類,但在Thread類中并沒有完全實現(xiàn) Runnable 接口中的 run() 方法,下面是 Thread 類的部分定義。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Runnable target;
public Thread(Runnable target,String name){
    init(null,target,name,0);
}
private void init(ThreadGroup g,Runnable target,String name,long stackSize){
    ...
    this.target=target;
}
public void run(){
    if(target!=null){
        target.run();
    }
}

從定義中可以發(fā)現(xiàn),在 Thread 類中的 run() 方法調(diào)用的是 Runnable 接口中的 run() 方法,也就是說此方法是由 Runnable 子類完成的,所以如果要通過繼承 Thread 類實現(xiàn)多線程,則必須覆寫 run()。

實際上 Thread 類和 Runnable 接口之間在使用上也是有區(qū)別的,如果一個類繼承 Thread類,則不適合于多個線程共享資源,而實現(xiàn)了 Runnable 接口,就可以方便的實現(xiàn)資源的共享。

線程的狀態(tài)變化

要想實現(xiàn)多線程,必須在主線程中創(chuàng)建新的線程對象。任何線程一般具有5種狀態(tài),即創(chuàng)建,就緒,運行,阻塞,終止。下面分別介紹一下這幾種狀態(tài):

  • 創(chuàng)建狀態(tài)

在程序中用構(gòu)造方法創(chuàng)建了一個線程對象后,新的線程對象便處于新建狀態(tài),此時它已經(jīng)有了相應(yīng)的內(nèi)存空間和其他資源,但還處于不可運行狀態(tài)。新建一個線程對象可采用Thread 類的構(gòu)造方法來實現(xiàn),例如 “Thread thread=new Thread()”。

  • 就緒狀態(tài)

新建線程對象后,調(diào)用該線程的 start() 方法就可以啟動線程。當線程啟動時,線程進入就緒狀態(tài)。此時,線程將進入線程隊列排隊,等待 CPU 服務(wù),這表明它已經(jīng)具備了運行條件。

  • 運行狀態(tài)

當就緒狀態(tài)被調(diào)用并獲得處理器資源時,線程就進入了運行狀態(tài)。此時,自動調(diào)用該線程對象的 run() 方法。run() 方法定義該線程的操作和功能。

  • 阻塞狀態(tài)

一個正在執(zhí)行的線程在某些特殊情況下,如被人為掛起或需要執(zhí)行耗時的輸入/輸出操作,會讓 CPU 暫時中止自己的執(zhí)行,進入阻塞狀態(tài)。在可執(zhí)行狀態(tài)下,如果調(diào)用sleep(),suspend(),wait() 等方法,線程都將進入阻塞狀態(tài),發(fā)生阻塞時線程不能進入排隊隊列,只有當引起阻塞的原因被消除后,線程才可以轉(zhuǎn)入就緒狀態(tài)。

  • 死亡狀態(tài)

線程調(diào)用 stop() 方法時或 run() 方法執(zhí)行結(jié)束后,即處于死亡狀態(tài)。處于死亡狀態(tài)的線程不具有繼續(xù)運行的能力。

在此提出一個問題,Java 程序每次運行至少啟動幾個線程?

回答:至少啟動兩個線程,每當使用 Java 命令執(zhí)行一個類時,實際上都會啟動一個 JVM,每一個JVM實際上就是在操作系統(tǒng)中啟動一個線程,Java 本身具備了垃圾的收集機制。所以在 Java 運行時至少會啟動兩個線程,一個是 main 線程,另外一個是垃圾收集線程。

取得和設(shè)置線程的名稱

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyThread implements Runnable{ //實現(xiàn)Runnable接口
    public void run(){
       for(int i=0;i<3;i++){
           System.Out.Println(Thread.currentThread().getName()+"運行, i="+i);  //取得當前線程的名稱
       }
  }
};
 
public class ThreadDemo{
public static void main(String args[]){
    MyThread my=new MyThread();  //定義Runnable子類對象
    new Thread(my).start;    //系統(tǒng)自動設(shè)置線程名稱
    new Thread(my,"線程A").start();  //手工設(shè)置線程名稱
  }
};

程序運行結(jié)果:

運用示例詳細總結(jié)Java多線程

線程的操作方法

剛才在分析自定義模式工作原理的時候其實就已經(jīng)提到了,如果想要更改Glide的默認配

線程的強制運行

在線程操作中,可以使用 join() 方法讓一個線程強制運行,線程強制運行期間,其他線程無法運行,必須等待此線程完成之后才可以繼續(xù)執(zhí)行。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class MyThread implements Runnable{ // 實現(xiàn)Runnable接口
    public void run(){  // 覆寫run()方法
        for(int i=0;i<50;i++){
            System.out.println(Thread.currentThread().getName()
                    + "運行,i = " + i) ;  // 取得當前線程的名字
        }
    }
};
public class ThreadJoinDemo{
    public static void main(String args[]){
        MyThread mt = new MyThread() ;  // 實例化Runnable子類對象
        Thread t = new Thread(mt,"線程");     // 實例化Thread對象
        t.start() ; // 啟動線程
        for(int i=0;i<50;i++){
            if(i>10){
                try{
                    t.join() ;  // 線程強制運行
                }catch(InterruptedException e){
                }
            }
            System.out.println("Main線程運行 --> " + i) ;
        }
    }
};

程序運行結(jié)果:

運用示例詳細總結(jié)Java多線程

線程的休眠

在程序中允許一個線程進行暫時的休眠,直接使用 Thread.sleep() 即可實現(xiàn)休眠。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class MyThread implements Runnable{ // 實現(xiàn)Runnable接口
    public void run(){  // 覆寫run()方法
        for(int i=0;i<50;i++){
            try{
                Thread.sleep(500) ; // 線程休眠
            }catch(InterruptedException e){
            }
            System.out.println(Thread.currentThread().getName()
                    + "運行,i = " + i) ;  // 取得當前線程的名字
        }
    }
};
public class ThreadSleepDemo{
    public static void main(String args[]){
        MyThread mt = new MyThread() ;  // 實例化Runnable子類對象
        Thread t = new Thread(mt,"線程");     // 實例化Thread對象
        t.start() ; // 啟動線程
    }
};

程序執(zhí)行結(jié)果:

運用示例詳細總結(jié)Java多線程

中斷線程

當一個線程運行時,另外一個線程可以直接通過interrupt()方法中斷其運行狀態(tài)。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class MyThread implements Runnable{ // 實現(xiàn)Runnable接口
    public void run(){  // 覆寫run()方法
        System.out.println("1、進入run()方法") ;
        try{
            Thread.sleep(10000) ;   // 線程休眠10秒
            System.out.println("2、已經(jīng)完成了休眠") ;
        }catch(InterruptedException e){
            System.out.println("3、休眠被終止") ;
            return ; // 返回調(diào)用處
        }
        System.out.println("4、run()方法正常結(jié)束") ;
    }
};
public class ThreadInterruptDemo{
    public static void main(String args[]){
        MyThread mt = new MyThread() ;  // 實例化Runnable子類對象
        Thread t = new Thread(mt,"線程");     // 實例化Thread對象
        t.start() ; // 啟動線程
        try{
            Thread.sleep(2000) ;    // 線程休眠2秒
        }catch(InterruptedException e){
            System.out.println("3、休眠被終止") ;
        }
        t.interrupt() ; // 中斷線程執(zhí)行
    }
};

程序運行結(jié)果是:

運用示例詳細總結(jié)Java多線程

后臺線程

在 Java 程序中,只要前臺有一個線程在運行,則整個 Java 進程都不會消失,所以此時可以設(shè)置一個后臺線程,這樣即使 Java 線程結(jié)束了,此后臺線程依然會繼續(xù)執(zhí)行,要想實現(xiàn)這樣的操作,直接使用 setDaemon() 方法即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class MyThread implements Runnable{ // 實現(xiàn)Runnable接口
    public void run(){  // 覆寫run()方法
        while(true){
            System.out.println(Thread.currentThread().getName() + "在運行。") ;
        }
    }
};
public class ThreadDaemonDemo{
    public static void main(String args[]){
        MyThread mt = new MyThread() ;  // 實例化Runnable子類對象
        Thread t = new Thread(mt,"線程");     // 實例化Thread對象
        t.setDaemon(true) ; // 此線程在后臺運行
        t.start() ; // 啟動線程
    }
};

在線程類 MyThread 中,盡管 run() 方法中是死循環(huán)的方式,但是程序依然可以執(zhí)行完,因為方法中死循環(huán)的線程操作已經(jīng)設(shè)置成后臺運行。

線程的優(yōu)先級

在 Java 的線程操作中,所有的線程在運行前都會保持在就緒狀態(tài),那么此時,哪個線程的優(yōu)先級高,哪個線程就有可能會先被執(zhí)行。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class MyThread implements Runnable{ // 實現(xiàn)Runnable接口
    public void run(){  // 覆寫run()方法
        for(int i=0;i<5;i++){
            try{
                Thread.sleep(500) ; // 線程休眠
            }catch(InterruptedException e){
            }
            System.out.println(Thread.currentThread().getName()
                    + "運行,i = " + i) ;  // 取得當前線程的名字
        }
    }
};
public class ThreadPriorityDemo{
    public static void main(String args[]){
        Thread t1 = new Thread(new MyThread(),"線程A") ;  // 實例化線程對象
        Thread t2 = new Thread(new MyThread(),"線程B") ;  // 實例化線程對象
        Thread t3 = new Thread(new MyThread(),"線程C") ;  // 實例化線程對象
        t1.setPriority(Thread.MIN_PRIORITY) ;   // 優(yōu)先級最低
        t2.setPriority(Thread.MAX_PRIORITY) ;   // 優(yōu)先級最高
        t3.setPriority(Thread.NORM_PRIORITY) ;  // 優(yōu)先級最中等
        t1.start() ;    // 啟動線程
        t2.start() ;    // 啟動線程
        t3.start() ;    // 啟動線程
    }
};

程序運行結(jié)果:

運用示例詳細總結(jié)Java多線程

從程序的運行結(jié)果中可以觀察到,線程將根據(jù)其優(yōu)先級的大小來決定哪個線程會先運行,但是需要注意并非優(yōu)先級越高就一定會先執(zhí)行,哪個線程先執(zhí)行將由 CPU 的調(diào)度決定。

線程的禮讓

在線程操作中,也可以使用 yield() 方法將一個線程的操作暫時讓給其他線程執(zhí)行

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class MyThread implements Runnable{ // 實現(xiàn)Runnable接口
    public void run(){  // 覆寫run()方法
        for(int i=0;i<5;i++){
            try{
                Thread.sleep(500) ;
            }catch(Exception e){
            }
            System.out.println(Thread.currentThread().getName()
                    + "運行,i = " + i) ;  // 取得當前線程的名字
            if(i==2){
                System.out.print("線程禮讓:") ;
                Thread.currentThread().yield() ;    // 線程禮讓
            }
        }
    }
};
public class ThreadYieldDemo{
    public static void main(String args[]){
        MyThread my = new MyThread() ;  // 實例化MyThread對象
        Thread t1 = new Thread(my,"線程A") ;
        Thread t2 = new Thread(my,"線程B") ;
        t1.start() ;
        t2.start() ;
    }
};

程序執(zhí)行結(jié)果:

運用示例詳細總結(jié)Java多線程

同步以及死鎖

一個多線程的程序如果是通過 Runnable 接口實現(xiàn)的,則意味著類中的屬性被多個線程共享,那么這樣就會造成一種問題,如果這多個線程要操作同一個資源時就有可能出現(xiàn)資源同步問題。

解決方法:

同步代碼塊

 synchronized(同步對象){ 
  需要同步的代碼 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class MyThread implements Runnable{
    private int ticket = 5 ;    // 假設(shè)一共有5張票
    public void run(){
        for(int i=0;i<100;i++){
            synchronized(this){ // 要對當前對象進行同步
                if(ticket>0){   // 還有票
                    try{
                        Thread.sleep(300) ; // 加入延遲
                    }catch(InterruptedException e){
                        e.printStackTrace() ;
                    }
                    System.out.println("賣票:ticket = " + ticket-- );
                }
            }
        }
    }
};
public class SyncDemo02{
    public static void main(String args[]){
        MyThread mt = new MyThread() ;  // 定義線程對象
        Thread t1 = new Thread(mt) ;    // 定義Thread對象
        Thread t2 = new Thread(mt) ;    // 定義Thread對象
        Thread t3 = new Thread(mt) ;    // 定義Thread對象
        t1.start() ;
        t2.start() ;
        t3.start() ;
    }
};

程序執(zhí)行結(jié)果:

運用示例詳細總結(jié)Java多線程

同步方法

除了可以將需要的代碼設(shè)置成同步代碼塊外,也可以使用 synchronized 關(guān)鍵字將一個方法聲明為同步方法。

 synchronized 方法返回值 方法名稱(參數(shù)列表){
 
 }

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class MyThread implements Runnable{
    private int ticket = 5 ;    // 假設(shè)一共有5張票
    public void run(){
        for(int i=0;i<100;i++){
            this.sale() ;   // 調(diào)用同步方法
        }
    }
    public synchronized void sale(){    // 聲明同步方法
        if(ticket>0){   // 還有票
            try{
                Thread.sleep(300) ; // 加入延遲
            }catch(InterruptedException e){
                e.printStackTrace() ;
            }
            System.out.println("賣票:ticket = " + ticket-- );
        }
 
    }
};
public class SyncDemo03{
    public static void main(String args[]){
        MyThread mt = new MyThread() ;  // 定義線程對象
        Thread t1 = new Thread(mt) ;    // 定義Thread對象
        Thread t2 = new Thread(mt) ;    // 定義Thread對象
        Thread t3 = new Thread(mt) ;    // 定義Thread對象
        t1.start() ;
        t2.start() ;
        t3.start() ;
    }
};

程序執(zhí)行結(jié)果:

運用示例詳細總結(jié)Java多線程

從程序運行的結(jié)果可以發(fā)現(xiàn),此代碼完成了與之前同步代碼同樣的功能。

死鎖

同步可以保證資源共享操作的正確性,但是過多同步也會產(chǎn)生問題。例如,現(xiàn)在張三想要李四的畫,李四想要張三的書,張三對李四說“把你的畫給我,我就給你書”,李四也對張三說“把你的書給我,我就給你畫”兩個人互相等對方先行動,就這么干等沒有結(jié)果,這實際上就是死鎖的概念。

所謂死鎖,就是兩個線程都在等待對方先完成,造成程序的停滯,一般程序的死鎖都是在程序運行時出現(xiàn)的。

下面以一個簡單范例說明這個概念

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
class Zhangsan{ // 定義張三類
    public void say(){
        System.out.println("張三對李四說:“你給我畫,我就把書給你。”") ;
    }
    public void get(){
        System.out.println("張三得到畫了。") ;
    }
};
class Lisi{ // 定義李四類
    public void say(){
        System.out.println("李四對張三說:“你給我書,我就把畫給你”") ;
    }
    public void get(){
        System.out.println("李四得到書了。") ;
    }
};
public class ThreadDeadLock implements Runnable{
    private static Zhangsan zs = new Zhangsan() ;       // 實例化static型對象
    private static Lisi ls = new Lisi() ;       // 實例化static型對象
    private boolean flag = false // 聲明標志位,判斷那個先說話
    public void run(){  // 覆寫run()方法
        if(flag){
            synchronized(zs){   // 同步張三
                zs.say() ;
                try{
                    Thread.sleep(500) ;
                }catch(InterruptedException e){
                    e.printStackTrace() ;
                }
                synchronized(ls){
                    zs.get() ;
                }
            }
        }else{
            synchronized(ls){
                ls.say() ;
                try{
                    Thread.sleep(500) ;
                }catch(InterruptedException e){
                    e.printStackTrace() ;
                }
                synchronized(zs){
                    ls.get() ;
                }
            }
        }
    }
    public static void main(String args[]){
        ThreadDeadLock t1 = new ThreadDeadLock() ;      // 控制張三
        ThreadDeadLock t2 = new ThreadDeadLock() ;      // 控制李四
        t1.flag = true ;
        t2.flag = false ;
        Thread thA = new Thread(t1) ;
        Thread thB = new Thread(t2) ;
        thA.start() ;
        thB.start() ;
    }
};

程序運行結(jié)果:

運用示例詳細總結(jié)Java多線程
?

以下代碼不再執(zhí)行,程序進入死鎖狀態(tài)。

到此這篇關(guān)于Java多線程詳細總結(jié)的文章就介紹到這了,更多相關(guān)Java多線程內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://www.cnblogs.com/java1024/archive/2019/11/28/11950129.html#top

延伸 · 閱讀

精彩推薦
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發(fā)項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java實現(xiàn)搶紅包功能

    Java實現(xiàn)搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現(xiàn)搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數(shù)據(jù)的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 天天操天天射天天色 | 操碰91| 村上里沙40分钟在线观看 | 国产亚洲精品91 | 范冰冰好紧好滑好湿 | 小舞同人18av黄漫网站 | 日本一区二区三区在线 观看网站 | 欧美最猛性xxxxx69交 | 亚洲精品国产一区二区三区在 | 亚洲九九精品 | 四虎国产精品免费久久麻豆 | 91日本在线 | 久久久久久久伊人电影 | 午夜综合网 | 天天操天天爽天天射 | 亚洲+国产+图片 | 国产成人盗拍精品免费视频 | 99精品久久精品一区二区小说 | 干操视频 | 欧美一级片在线免费观看 | 办公室恋情在线 | 成年人免费在线看的惊悚动作片 | 亚洲 欧美 清纯 校园 另类 | 午夜影院一区二区三区 | 美女用手扒自己下部 | 网红刘婷hd国产高清 | 免费一看一级欧美 | 美女脱得一二净无内裤全身的照片 | 厨房里摸着乳丰满在线观看 | 搡60一70岁的老女人小说 | 性xxxxxxx18老师 | 精品国产在线观看 | 情欲满载2012美国dvd | 插得爽| 免费在线视频网站 | 99re免费在线视频 | freefron性中国国产高清 | 九九精品视频在线免费观看 | 亚洲午夜精品久久久久久成年 | 国产精品主播在线 | 欧美亚洲另类在线观看 |