天天看點

胡亂學Java_多線程_通路成員變量與局部變量寫在前面寫在中間寫在後面

寫在前面

今天照例學Java,看到了多線程的知識,跟着視訊巧了兩個例子,發現了成員變量和局部變量在多線程裡面的影響是不同的。

寫在中間

我是用Runnable接口來做的多線程

例子如下

1、模拟12306搶票

Code

package com.xq.thread.runnable;
public class Web12306 implements Runnable {
	private int ticketNums = 20;   🐷
	@Override
	public void run() {
		while(true){
			if(ticketNums <= 0){
				break;
			}else {
				System.out.println(Thread.currentThread().getName() + "---> " + ticketNums--);
			}
		}
	}

	public static void main(String[] args) {
		Web12306 web = new Web12306();
		new Thread(web,"大全").start();
		new Thread(web,"大圈").start();
		new Thread(web,"大券").start();
	}
}

           

🐷處的

ticketNums

是成員變量

我們建立了一個實作類對象web

然後用了三個匿名代理對象去啟動線程

輸出的結果是:

大圈---> 19
大券---> 18
大全---> 20
大全---> 15
大券---> 16
大券---> 13
大券---> 12
大券---> 11
大券---> 10
大圈---> 17
大圈---> 8
大圈---> 7
大圈---> 6
大圈---> 5
大圈---> 4
大圈---> 3
大圈---> 2
大圈---> 1
大券---> 9
大全---> 14

Process finished with exit code 0

           

從20到1一共20次輸出

2、模拟龜兔賽跑

Code

package com.xq.thread.runnable;
/**
 * 模拟龜兔賽跑
 */
public class Racer implements Runnable{
	private String winner;
	@Override
	public void run() {
		for (int i = 0; i <= 20; i++) {
			System.out.println(Thread.currentThread().getName() + "--->" + i);
			boolean flag = getOver(i);
			if(flag){
				break;
			}
		}
	}
	public boolean getOver(int i){
		if(winner != null){
			return true;
		}else if(i == 20) {
			winner = Thread.currentThread().getName();
			System.out.println("GameOver,winner:" + winner);
			return true;
		}else {
			return false;
		}
	}

	public static void main(String[] args) {
		Racer r = new Racer();
		new Thread(r,"烏龜").start();
		new Thread(r,"兔子").start();
	}
}

           

這裡的i在

run()

方法的内部,屬于局部變量

輸出:

烏龜--->0
兔子--->0
烏龜--->1
烏龜--->2
兔子--->1
烏龜--->3
兔子--->2
烏龜--->4
兔子--->3
烏龜--->5
兔子--->4
烏龜--->6
兔子--->5
烏龜--->7
烏龜--->8
兔子--->6
烏龜--->9
兔子--->7
烏龜--->10
兔子--->8
烏龜--->11
兔子--->9
烏龜--->12
兔子--->10
烏龜--->13
兔子--->11
烏龜--->14
兔子--->12
烏龜--->15
兔子--->13
烏龜--->16
烏龜--->17
兔子--->14
烏龜--->18
兔子--->15
兔子--->16
烏龜--->19
兔子--->17
烏龜--->20
兔子--->18
GameOver,winner:烏龜

Process finished with exit code 0

           

兔子和烏龜各自都跑了一遍1到20

寫在後面

可以看出來

成員變量:每一個線程共享使用一個變量

局部變量:每一個線程都有自己的備份,互不幹擾

這是我胡亂猜的,等我入門多線程再來看看應該怎麼正确了解🙃

另外在搜資料的時候發現了大佬的博文,我看的教程裡面老師的确說Runnable資源共享比較厲害,這就存一下大神的博文:click

EOF