2015年9月20日 星期日

JAVA SL-275_09/20

/*
join
如果 A 執行緒正在運行,流程中允許 B 執行緒加入,等到 B 執行緒執行完畢再繼續 A 執行緒流程就可以使用 join() 方法完成需求,當執行緒使用 join() 加入至另一執行緒時,另一執行緒會等待被加入的執行緒工作完畢然後再續繼它的動作。
*/

//*****************************************************************************
//joinDemo.java

public class joinDemo{

        public static void main(String args[]){

                System.out.println("Main thread 開始…");
                Thread threadB = new Thread(){
                        public void run(){
                                try{
                                        System.out.println("Thread B 開始…");
                                        for(int i=0;i<5 ain="" b="" catch="" e.printstacktrace="" e="" ex.printstacktrace="" ex="" hread="" i="" main="" nterruptedexception="" pre="" s="" system.out.println="" thread.sleep="" thread="" threadb.join="" threadb.start="" try="">
//*****************************************************************************

/*

Thread Group

每個執行緒都屬於某個執行緒群組,可以使用以下程式片段取得目前執行緒所屬的執行緒群組。

Thread.currentThread().getThreadGroup().getName();

可以自行指定執行緒群組,執行緒一旦加入,即無法更改群組。



java.lang.ThreadGroup 可以管理群組中的執行緒。

*/

//*****************************************************************************

//ThreadGroupDemo.java
public class ThreadGroupDemo {
        public static void main(String args[]){

                ThreadGroup tg1 = new ThreadGroup("tg1");
                Thread t1 = new Thread(tg1, new Runnable(){
                        public void run(){
                                throw new RuntimeException("t1 測試例外");
                        }
                },"tg1");

                t1.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
                        public void uncaughtException(Thread t, Throwable e) {
                                System.out.printf("%s ... %s%n", t.getName(), e.getMessage());
                        }
                });

                Thread t2 = new Thread(tg1, new Runnable(){                             
                        public void run(){
                                throw new RuntimeException("t2 測試例外");
                        }
                },"tg2");

                t1.start();
                t2.start();
        }
}
//***************************************************************************** // 兩執行緒同時間點別相同的方法,會出現競速狀態出現 Error // 下例的 Error: Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException // java.lang.OutOfMemoryError 先不管它,此處為了探討競速物件。
import java.util.Arrays;

public class ArrayList {
        private Object[] list;
        private int next;
        public ArrayList(int capacity){
                list = new Object[capacity];
        }
        public ArrayList(){
                this(16);
        }

        public void add(Object o){
                //System.out.println("add start...");
                if(next == list.length){
                        list = Arrays.copyOf(list, list.length * 2);
                }
                list[next++]=o;
        }
        public Object get(int index){
                return list[index];
        }
        public int size(){ 
                return next;
        }
        public static void main(String args[]){
                ArrayList list = new ArrayList();
                Thread t1 = new Thread(){
                        public void run(){
                                while(true){
                                        list.add(1);
                                }
                        }
                };
                Thread t2 = new Thread(){
                        public void run(){
                                while(true){
                                        list.add(2);
                                }
                        }
                };
                t1.start();
                t2.start();
        }
}
//----------------------------------------------------------------------------------------------- // 同上範例,加入 synchronized 除掉競速問題 // 同樣會有  java.lang.OutOfMemoryError 此處不管它 import java.util.Arrays; public class ArrayList {  private Object[] list;  private int next;  public ArrayList(int capacity){   list = new Object[capacity];  }  public ArrayList(){   this(16);  }  synchronized public void add(Object o){   if(next == list.length){    list = Arrays.copyOf(list, list.length * 2);   }   list[next++]=o;  }  public Object get(int index){   return list[index];  }  public int size(){   return next;  }  public static void main(String args[]){   ArrayList list = new ArrayList();     Thread t1 = new Thread(){    public void run(){     while(true){      synchronized(list){           list.add(1);       System.out.println(list.get(list.size()-1));      }     }    }   };   Thread t2 = new Thread(){    public void run(){     while(true){        synchronized(list){       System.out.println(list.get(list.size()-1));       list.add(2);      }     }    }   };    t1.start();    t2.start();    } } //***************************************************************************** /* synchronized 與 volatile 在 Java 中對資可見性的要求,可以使用 volatile 達到,在變數上宣告,表示變數是不穩定的是易變的,也就是可能在多執行緒下存取,可保證變數的可見性,也是是若執行緒變動了變數值,另一執行緒一可以看到變更。 不允許執行緒快取,變數的存取是在共享記憶體中進行。 */ //***************************************************************************** // 寫一個練習,分為四個檔案: // Producer.java package java_0920; public class Producer implements Runnable {  private Clerk clerk;  public Producer(Clerk clerk){   this.clerk = clerk;  }  public void run(){   System.out.println("生產者開始生產…");   for(int product=1;product<=10;product++){    try{     Thread.sleep((int)(Math.random()*3000));    }catch(InterruptedException ex){     throw new RuntimeException(ex);    }    clerk.setProduct(product);   }  } } //Consumer.java package java_0920; public class Consumer implements Runnable {  private Clerk clerk;  public Consumer(Clerk clerk){   this.clerk = clerk;  }  public void run(){   System.out.println("消費者開始消費…");   for(int i=1;i<=10;i++){    try{     Thread.sleep((int)(Math.random()*3000));    }catch(InterruptedException ex){     throw new RuntimeException(ex);    }    int product = clerk.getProduct();   }  } } //Clerk.java package java_0920; public class Clerk {  private int product = -1 ;    public synchronized int getProduct() {   while(this.product != -1){    try{     wait();    }catch(InterruptedException e){     throw new RuntimeException(e);    }   }   int p = this.product;   System.out.printf("消費者取得…(%d)%n",this.product);   this.product=-1;   notify();   return p;  }  public synchronized void setProduct(int product) {   while(this.product != -1){    try{     wait();    }catch(InterruptedException e){     throw new RuntimeException(e);    }   }   this.product = product;   System.out.printf("生產者設定…(%d)%n", this.product);   notify();  } } //ProducerConsumerDemo.java package java_0920; public class ProducerConsumerDemo {  public static void main(String args[]){   Clerk clerk = new Clerk();   new Thread(new Producer(clerk)).start();   new Thread(new Consumer(clerk)).start();  } } //***************************************************************************** /* Collection 集合架構介面關係圖 ※可動態產生集合元素 可置入不同型別的資料,依照各集合的特性有:排序性、順序性、不允許重複、是否有鍵值的使用。 <String, Integer> 泛型 public interface Set implements Collection 其特性是無順序性,並且元素與元素之間不得重複。 其利用 equal() 方法來判斷加入的物件是否重複,Set 是資料具唯一性但無順序性的集。 ※ 不是用 equals (用於比較字串) */ //***************************************************************************** //HashSet //沒有順序性 (擺放位置是根據 hashCode) 不允許重複 import java.util.*; public class HashSetDemo {  public static void main(String argsp[]){   HashSet<String> s = new HashSet<String>();   s.add("SCJP");   s.add("SCWCD");   s.add("SCBCD");     Iterator i = s.iterator();   while(i.hasNext()){    String str = (String)i.next();    System.out.println(str + " ");   }  } } //***************************************************************************** //練習:重複輸入的資料只顯示一個 import java.util.*; public class HashSetDemo2 {  public static void main(String args[]){   Set<String> words = new HashSet<String>();   Scanner scanner = new Scanner(System.in);   System.out.println("Input english word:");   String line = scanner.nextLine();   String tokens[] = line.split(" ");   for(String token:tokens){    words.add(token);   }     System.out.printf("不重複的單字有(%d)個 %s%n", words.size(), words);    } } //執行後自己手動輸入單字,以空白隔開,會自動過濾並顯示出不重複單字。 //***************************************************************************** import java.util.*; class Student {  private String name;  private String number;  Student(String name, String number){   this.name=name;   this.number=number;  }  public String toString(){   return String.format("(%s %s)", name, number);  } } public class StudentDemo{  public static void main(String args[]){   /*   Set<String> set = new HashSet<String>();   set.add(new Student("Justin", "B6789").toString());   set.add(new Student("Monica", "B8765").toString());   set.add(new Student("Joe", "B213678").toString());   */   Set set = new HashSet();   set.add(new Student("Monica", "B8765"));   set.add(new Student("Justin", "B6789"));   set.add(new Student("Joe", "B213678"));       System.out.println(set);  } }

沒有留言:

張貼留言