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

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

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

服務(wù)器之家 - 編程語言 - Java教程 - Java線程使用同步鎖交替執(zhí)行打印奇數(shù)偶數(shù)的方法

Java線程使用同步鎖交替執(zhí)行打印奇數(shù)偶數(shù)的方法

2021-07-13 15:27boonya Java教程

這篇文章主要介紹了Java線程使用同步鎖交替執(zhí)行打印奇數(shù)偶數(shù)的方法。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

對同一個對象進(jìn)行多線程操作時,如何保證線程執(zhí)行結(jié)果的一致性?我們需要對線程操作對象加同步鎖。(這是一道面試題)

需求描述

1-20個數(shù)字

a線程打印奇數(shù):1,3,5,7,9,11,13,15,17,19

b線程打印偶數(shù):2,4,6,8,10,12,14,16,18,20

c線程在ab兩個線程執(zhí)行完了之后打印結(jié)果:“success”。

線程代碼實現(xiàn)

num.java

?
1
2
3
4
5
6
7
8
9
10
11
12
package com.boonya.thread.test;
 
/**
 * @classname: num
 * @description: todo(加鎖計算對象)
 * @author: pengjunlin
 * @motto: 學(xué)習(xí)需要毅力,那就秀毅力
 * @date 2019-01-14 22:47
 */
public class num {
  int value=1;
}

athread.java

?
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
package com.boonya.thread.test;
 
/**
* @classname: athread
* @description: todo(奇數(shù)線程)
* @author: pengjunlin
* @motto: 學(xué)習(xí)需要毅力,那就秀毅力
* @date 2019-01-14 22:26
*/
public class athread implements runnable{
 
  num num;
 
  public athread(num num){
    this.num=num;
  }
 
  public void run() {
    while (num.value<20){
      synchronized (num){
        if(num.value%2!=0){
          system.out.println("athread:"+ num.value);
          num.value++;
        }
      }
    }
 
  }
}

bthread.java

?
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
package com.boonya.thread.test;
 
/**
 * @classname: bthread
 * @description: todo(偶數(shù)線程)
 * @author: pengjunlin
 * @motto: 學(xué)習(xí)需要毅力,那就秀毅力
 * @date 2019-01-14 22:26
 */
public class bthread implements runnable {
 
    num num;
 
    public bthread(num num){
      this.num=num;
    }
 
    public void run() {
      while (num.value<=20){
        synchronized (num){
          if(num.value%2==0){
            system.out.println("bthread:"+ num.value);
            num.value++;
          }
        }
      }
    }
 }

cthread.java

?
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
package com.boonya.thread.test;
 
/**
 * @classname: cthread
 * @description: todo(等待結(jié)果線程)
 * @author: pengjunlin
 * @motto: 學(xué)習(xí)需要毅力,那就秀毅力
 * @date 2019-01-14 22:26
 */
public class cthread implements runnable {
 
    num num;
 
    public cthread(num num){
      this.num=num;
    }
 
    public void run() {
      while (num.value<20){
        try {
          thread.sleep(1);
        } catch (interruptedexception e) {
          e.printstacktrace();
        }
      }
      system.out.println("cthread:success!");
    }
  }

maintest.java

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
package com.boonya.thread.test;
 
import java.util.arraylist;
import java.util.list;
 
/**
 * @classname: maintest
 * @description: todo(線程測試)
 * @author: pengjunlin
 * @motto: 學(xué)習(xí)需要毅力,那就秀毅力
 * @date 2019-01-14 21:54
 */
public class maintest {
 
  public static void main(string[] args) {
    num num=new num();
    thread a=new thread(new athread(num));
    thread b=new thread(new bthread(num));
    thread c=new thread(new cthread(num));
    a.start();
    b.start();
    c.start();
  }
}

測試結(jié)果

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
"c:\program files\java\jdk1.8.0_121\bin\java" "-javaagent:c:\users\boonya\appdata\roaming\jetbrains\intellij idea 2017.2.5\lib\idea_rt.jar=51911:c:\users\boonya\appdata\roaming\jetbrains\intellij idea 2017.2.5\bin" -dfile.encoding=utf-8 -classpath "c:\program files\java\jdk1.8.0_121\jre\lib\charsets.jar;c:\program files\java\jdk1.8.0_121\jre\lib\deploy.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\access-bridge-64.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\cldrdata.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\dnsns.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\jaccess.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\jfxrt.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\localedata.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\nashorn.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\sunec.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\sunjce_provider.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\sunmscapi.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\sunpkcs11.jar;c:\program files\java\jdk1.8.0_121\jre\lib\ext\zipfs.jar;c:\program files\java\jdk1.8.0_121\jre\lib\javaws.jar;c:\program files\java\jdk1.8.0_121\jre\lib\jce.jar;c:\program files\java\jdk1.8.0_121\jre\lib\jfr.jar;c:\program files\java\jdk1.8.0_121\jre\lib\jfxswt.jar;c:\program files\java\jdk1.8.0_121\jre\lib\jsse.jar;c:\program files\java\jdk1.8.0_121\jre\lib\management-agent.jar;c:\program files\java\jdk1.8.0_121\jre\lib\plugin.jar;c:\program files\java\jdk1.8.0_121\jre\lib\resources.jar;c:\program files\java\jdk1.8.0_121\jre\lib\rt.jar;c:\users\boonya\desktop\javaalgorithm\target\test-classes;c:\users\boonya\desktop\javaalgorithm\target\classes" com.boonya.thread.test.maintest
athread:1
bthread:2
athread:3
bthread:4
athread:5
bthread:6
athread:7
bthread:8
athread:9
bthread:10
athread:11
bthread:12
athread:13
bthread:14
athread:15
bthread:16
athread:17
bthread:18
athread:19
bthread:20
cthread:success!
 
process finished with exit code 0

注意:synchronized 作為方法塊使用時需要只能對對象加鎖,不能是常用數(shù)據(jù)類型。

ab線程改進(jìn):使用線程等待和通知

athread.java

?
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
package com.boonya.thread.test;
 
/**
* @classname: athread
* @description: todo(奇數(shù)線程)
* @author: pengjunlin
* @motto: 學(xué)習(xí)需要毅力,那就秀毅力
* @date 2019-01-14 22:26
*/
public class athread implements runnable{
 
  num num;
 
  public athread(num num){
    this.num=num;
  }
 
  public void run() {
    while (num.value<20){
      synchronized (num){
        if(num.value%2!=0){
          system.out.println("athread:"+ num.value);
          num.value++;
          //num.notify();
          num.notifyall();
        }else{
          try {
            num.wait();
          } catch (interruptedexception e) {
            e.printstacktrace();
          }
        }
      }
    }
 
  }
}

bthread.java

?
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
package com.boonya.thread.test;
 
/**
 * @classname: bthread
 * @description: todo(偶數(shù)線程)
 * @author: pengjunlin
 * @motto: 學(xué)習(xí)需要毅力,那就秀毅力
 * @date 2019-01-14 22:26
 */
public class bthread implements runnable {
 
    num num;
 
    public bthread(num num){
      this.num=num;
    }
 
    public void run() {
      while (num.value<=20){
        synchronized (num){
          if(num.value%2==0){
            system.out.println("bthread:"+ num.value);
            num.value++;
            //num.notify();
            num.notifyall();
          }else{
            try {
              num.wait();
            } catch (interruptedexception e) {
              e.printstacktrace();
            }
          }
        }
      }
    }
 }

注:線程等待和通知的操作是節(jié)省cpu運算的一種方式,避免cpu空轉(zhuǎn)(線程方法一直不停地跑類似于死循環(huán)是很可怕的),如果是要讓線程停下來需要調(diào)用線程的wait()。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/boonya/article/details/86485504

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲成人影院在线 | 亚洲国产精品无码中文字满 | 边吃奶边扎下面 | 亚洲色图欧美色 | 免费特黄一级欧美大片在线看 | 亚洲天堂999| 欧美z0z0人禽交 | 猥琐对着美女飞机喷到脸上 | 国产色视频网站 | 日韩在线观看一区二区不卡视频 | 国产人妖ts在线视频网 | 国产特级毛片aaaaaa | 亚洲精品第二页 | 91久久精品青青草原伊人 | 午夜深情在线观看免费 | 免费观看成年肉动漫网站 | 日本在线视频网 | 久见久热 这里只有精品 | 丁香久久婷婷 | 国产1区2区在线观看 | 欧美精品一国产成人性影视 | 暖暖的免费观看高清视频韩国 | 三上悠亚久久国产 | 欧美日韩一区二区三区在线视频 | 草草视频在线观看最新 | 国产一区二区三区欧美 | 91精品国产在线 | 四虎国产成人亚洲精品 | ass性强迫rape | 男人j放进女人的p视频免费 | 男人搡女人视频免费看 | 日本肉体xxxx | 含羞草传媒一天免费看下 | 亚洲视频999 | 门卫老张和女警花小说 | 亚洲va欧美va国产综合久久 | 美女露鸡鸡 | 午夜国产在线视频 | 男gay男gay男gay野外 | 日本免费高清在线 | sss在线观看免费视频 |