2013-01-14 218 views
0

我需要爲下創建一個Java程序:線程和同步

  1. 創建一個ArrayList來存儲僱員的名字。
  2. 創建兩個同步方法將員工姓名添加到ArrayList並打印員工姓名。
  3. 線程完成添加員工後,打印員工姓名。

我已經做了以下,但它不工作。它在行「pr.print(X)」發出異常。任何人都可以幫忙嗎?這不是我的家庭!我只是想學習。

import java.util.*; 

public class Ch5Ex2 
{ 
    public static void main(String[] args) 
    { 
    List<String> li = new ArrayList<String>(); 
    Print pri = new Print(); 
    pri.start(); 
    Insert in = new Insert(li); 
    in.start(); 
    } 
} 

class Insert extends Thread 
{ 
Print pr = new Print(); 
List<String> x; 
public Insert(List<String> x) 
    { 
    this.x = x; 
    } 

public synchronized void run() 
{ 
    try 
    { 
     x.add("robin"); 
     x.add("ravi"); 
     x.add("raj"); 
     pr.print(x); 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 

} 

class Print extends Thread 
{ 
List<String> y; 
public void print(List<String> y) 
{ 
    this.y = y; 
    notify(); 
} 

public synchronized void run() 
{ 
    try 
    { 
    wait(); 
    for(int i=0;i<y.size();i++) 
     { 
     System.out.println(y.get(i)); 
     } 
    } 
    catch(Exception e) 
    { 
     e.printStackTrace(); 
    } 
} 
} 
+2

什麼異常? –

+0

NullPointerException – Robin

+0

爲什麼當我在做完所有事情之後只是要求一個小的查詢時,我的帖子就會得到負面投票? – Robin

回答

2

我認爲你需要這樣的:

import java.util.*; 

public class Ch5Ex2 { 
    public static void main(String[] args) { 
     List<String> li = new ArrayList<String>(); 
     Print pri = new Print(); 
     pri.start(); 
     Insert in = new Insert(li, pri); 
     in.start(); 
    } 
} 


class Insert extends Thread { 
    Print pr; 
    List<String> x; 
    public Insert(List<String> x, Print p) { 
     this.x = x; 
     pr = p; 
    } 

    public synchronized void run() { 
     try{ 
      x.add("robin"); 
      x.add("ravi"); 
      x.add("raj"); 
      pr.print(x); 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

class Print extends Thread { 
    List<String> y; 
    public synchronized void print(List<String> y) { 
     this.y = y; 
     notify(); 
    } 

    public synchronized void run() { 
     try { 
      while(y == null){ 
       wait(); 
      } 
      for(int i=0;i<y.size();i++) { 
       System.out.println(y.get(i)); 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

現在,這個應該工作.. 。

解決方案是:當你在Print threadmain()方法創建pri objectwait(),必須notify()這個pri object爲了使Print thread繼續。此外,如果notify()之前Print thread開始叫,它會讓Printynon-null和你Print thread不會在這種情況下做wait() .. :)

+0

仍然沒有輸出。 – Robin

+0

你有沒有試過運行上面的代碼?再試幾次..也是不正確的解決方案,但它必須工作,如果打印線程在插入線程之前啓動。我得到輸出.. – UDPLover

+0

@MeramanI沒有嘗試...沒有運行...沒有輸出。 – Robin

2

我猜pr是空的Insert類,你永遠不會調用構造函數。

+0

我現在實例化了pr,但它沒有打印任何東西 – Robin

0

爲了使您的生活更輕鬆,你可以瞭解同步忘了您的應用水平,只是通過調用Create sychronized ArrayListCollections#synchronizedList()這樣

列表yourArray = Collections.synchronizedList(新的ArrayList())

在這種情況下,來自不同線程的所有對yourArray的調用都將被同步。 除此之外看起來像pr爲空,因爲你從來沒有實例化它(感謝@尼古拉庫茲涅佐夫)。

0

你是不是pr.You分配內存只是創建可變印刷pr.So你一定是NPE