2013年11月7日 星期四

Thread Test!!



import java.util.LinkedList;
import java.util.List;


public class Can {
public static int count = 0;
public LinkedList<String> can = new LinkedList<String>();

public Can(){
count++ ;
System.out.println(count);
}
public void addObj(String obj){
can.addLast(obj);
}
public void removeObj(){
can.removeLast();
}
@Override
public String toString() {
return can.toString();
}
}

-------------------------------------------------------------------

class Person implements Runnable{
public String name;
public Can can;
public Person(Can can, String name){
this.can = can ;
this.name = name ;
}
public void action(){
int SIZE = 100;
if(can.can.size() == SIZE){
for(int i = 0 ; i < SIZE; i++){
can.removeObj();
System.out.println(name +" take");
}
}else{
for(int i = 0 ; i < SIZE; i++){
can.addObj(name);
System.out.println(name +" drop");
}
}
}
@Override
public void run() {

//
synchronized(this){ // 鎖在自己身上。沒用!!
synchronized(can){  // 鎖在同樣的instance上。work!!
action();
}
}
}
public class Main {
public static Can c = new Can();
public static Can getACan(){
return c;  // 模擬Container, singleton
// return new Can();// 模擬Container, non-singleton
}
public static void main(String[] args) {
Can can = getACan();
Thread p1Action = new Thread(new Person(getACan(), "A"));
p1Action.start();

Thread p2Action = new Thread(new Person(getACan(), "B"));
p2Action.start();
}

}