2016-09-23 160 views
-6

我有下面的代碼,我正在試驗同步。 我已經使用了使用擴展線程t2創建的一個線程。我也通過runnable創建一個線程。然而,我似乎無法得到可運行的線程工作。線程可運行vs擴展線程

出了什麼問題?我還沒有練習java 6個月,所以重新回到了事物的擺動中。

package threadingchapter4; 

class Table { 
void printTable(int n) { 
synchronized (this) {// synchronized block 
for (int i = 1; i <= 5; i++) 
{ 
System.out.println(n * i + " "+ Thread.currentThread().getName() + " (" 
+ Thread.currentThread().getId()); 
try { 
Thread.sleep(400); 
} catch (Exception e) { 
System.out.println(e); 
} 
       } 
} 
}// end of the method 
} 

class t1 implements Runnable { 
Table t; 

t1(Table t) { 
this.t = t; 
} 

public void run() { 
t.printTable(5); 
} 

} 

class MyThread2 extends Thread { 
Table t; 

MyThread2(Table t) { 
this.t = t; 
} 

public void run() { 
t.printTable(100); 
} 
} 
public class TestSynchronizedBlock1 { 
public static void main(String args[]){ 
Table obj = new Table();//only one object 
Thread t1 = new Thread(obj); 
MyThread2 t2=new MyThread2(obj); 
t1.start(); 
t2.start(); 
} 
} 
+3

你的格式和命名約定是可怕的。而你的代碼不能編譯。而且你沒有在任何地方使用你的't1'類。 – shmosel

+1

請至少格式化您的代碼。請參閱[如何格式化代碼](http://meta.stackexchange.com/a/22189/340735) –

+0

您應該使用更好的命名約定。另外在'Thread t1 = new Thread((obj);')時出現編譯錯誤,缺少一個末端括號'''。錯誤究竟是什麼? –

回答

2

我想你已經對自己的命名約定感到困惑。我假設你試圖做到這一點:

public static void main(String args[]){ 
    Table obj = new Table();//only one object 
    Thread thread1 = new Thread(new t1(obj)); // t1 is the Runnable class 
    MyThread2 thread2 = new MyThread2(obj); 
    thread1.start(); 
    thread2.start(); 
} 
+0

@ shmosel多數民衆贊成在工作,但爲什麼我必須創建一個新的實例與表obj啓動線程? – Ingram

+0

@MrAssistance而不是做什麼? – shmosel

+0

@ shmosel以及我的問題是爲什麼不是線程2的調用方法。obj的一個實例被傳遞給類MyThread2。看起來像在thread1中我創建了一個名爲thread1的新線程,然後在其中創建了一個新的線程t1與表對象。這是我感到困惑的地方。 – Ingram