多執行緒學習(七)
阿新 • • 發佈:2018-11-03
問題
1.賣票系統(如果每個執行緒執行的程式碼相同,可以使用同一個Runnable物件,這個Runnable物件中有那個共享資料)
解決
public class MultiThreadShareDataStudy { public static void main(String[] args) { TicketSystem t1 = new TicketSystem(); new Thread(t1).start(); new Thread(t1).start(); } } class TicketSystem implements Runnable{ private int count = 100; @Override public void run() { // TODO Auto-generated method stub while(true){ if(count > 0){ count--; System.out.println("當前執行執行緒 "+Thread.currentThread().getName()+"票剩餘數量:"+count); } } } }
2.設計4個執行緒,其中兩個執行緒對j加1,另外兩個執行緒對j減1,寫出程式。(如果每個執行緒執行的程式碼不同,需要不同的Runnable物件)
解決
<1> 將共享資料封裝在另外一個物件中,然後將這個物件逐一傳給Runnbale物件,每個執行緒對共享資料的操作方法也分配到那個物件身上去完成,這樣容易實現對資料進行各個操作的互斥和通訊。
public class MultiThreadShareDataStudy { public static void main(String[] args) { ShareData data = new ShareData(); new Thread(new Runnable1(data)).start(); new Thread(new Runnable2(data)).start(); } } class Runnable1 implements Runnable{ private ShareData data; public Runnable1(ShareData data) { this.data = data; } @Override public void run() { data.decrease(); } } class Runnable2 implements Runnable{ private ShareData data; public Runnable2(ShareData data) { this.data = data; } @Override public void run() { data.increase(); } } class ShareData{ private int j = 100; public synchronized void increase(){ j++; System.out.println("當前執行執行緒 "+Thread.currentThread().getName()+"執行加操作,j="+j); } public synchronized void decrease(){ j--; System.out.println("當前執行執行緒 "+Thread.currentThread().getName()+"執行減操作,j="+j); } }
<2> 將Runnable物件作為某個類的內部類,共享資料作為外部類的成員變數,每個執行緒對資料操作的方法也分配給外部類,實現對共享資料的操作的互斥和通訊,作為內部類的各個Runnable物件呼叫外部類這些方法。
public static ShareData data1 = new ShareData(); public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { data1.decrease(); } }).start(); new Thread(new Runnable() { @Override public void run() { data1.increase(); } }).start(); } } class ShareData{ private int j = 100; public synchronized void increase(){ j++; System.out.println("當前執行執行緒 "+Thread.currentThread().getName()+"執行加操作,j="+j); } public synchronized void decrease(){ j--; System.out.println("當前執行執行緒 "+Thread.currentThread().getName()+"執行減操作,j="+j); } }
<3>第三種方式
public class MultiThreadShareDataStudy {
private int j = 100;
public static void main(String[] args) {
MultiThreadShareDataStudy m = new MultiThreadShareDataStudy();
Dec de = m.new Dec();
InCrease in = m.new InCrease();
new Thread(in).start();
new Thread(de).start();
}
public synchronized void increase(){
j++;
System.out.println("當前執行執行緒 "+Thread.currentThread().getName()+"執行加操作,j="+j);
}
public synchronized void decrease(){
j--;
System.out.println("當前執行執行緒 "+Thread.currentThread().getName()+"執行減操作,j="+j);
}
class InCrease implements Runnable{
@Override
public void run() {
increase();
}
}
class Dec implements Runnable{
@Override
public void run() {
decrease();
}
}
}