1:
如果每個線程執行的代碼相同,可以使用同一個Runnable對象,然后將共享的數據放在Runnable里面,來實現數據的共享。 例如買票系統...
package com.cn.gbx;import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;public class TestThread {public static void main(String[] args) {//共享數據放在了Count里面Count count = new Count();new Thread(count).start();new Thread(count).start();}
}class Count implements Runnable{private int count = 10;//加互斥鎖,來時實現同步private synchronized void decrement() {count--;System.out.println(Thread.currentThread().getName() + " : " + count);}@Overridepublic void run() {while (true) {decrement();}}
}
2: 如果每個線程執行的代碼不同, 那么就需要不同的Runnable對象,有兩種方式事項這些Runnbale對象之間的數據共享
a: 將共享數據封裝在另一個對象中,然后實現不同的操作,然后將這個新對象傳遞給Runnable對象,每個線程對共享數據的操作也就相應的分配到了那個對象身上去完成。這樣就能夠實現對該數據的各種操作的互斥與通信
package com.cn.gbx;import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;public class TestThread {public static void main(String[] args) {ShareData count = new ShareData();new Thread(new CountDec(count)).start();new Thread(new CountInc(count)).start();}
}//將共享數據封裝在另一個對象里面
class ShareData {private int count = 100;public synchronized void decrement() {count--;System.out.println(Thread.currentThread().getName() + " :" + count);}public synchronized void increment() {count++;System.out.println(Thread.currentThread().getName() + " :" + count); }
}//然后將新對象放入Runnable對象
class CountDec implements Runnable {private ShareData data = null;public CountDec(ShareData data) {this.data = data;}@Overridepublic void run() {while (true) {data.decrement();}}
}
class CountInc implements Runnable {private ShareData data = null;public CountInc(ShareData data) {this.data = data;}@Overridepublic void run() {while (true) {data.increment();}}
}
b: 將這些Runnbale對象作為某一個類中的內部類,共享數據作為外部類的成員變量,每個線程對共享數據的操作也就分配給了外部類,以便實現共享數據的各種操作的互斥通信。
package com.cn.gbx;import java.util.Date;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;public class TestThread {//將共享數據作為外部類的成員變量final private static ShareData data = new ShareData();public static void main(String[] args) {//Runnbale內部類可以共享new Thread(new Runnable() {@Overridepublic void run() {while (true) {data.decrement();}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {data.increment();}}}).start();}
}//將共享數據封裝在另一個對象里面
class ShareData {private int count = 100;public synchronized void decrement() {count--;System.out.println(Thread.currentThread().getName() + " :" + count);}public synchronized void increment() {count++;System.out.println(Thread.currentThread().getName() + " :" + count); }
}
?