2013-07-29 29 views
0

小程序不清執行我創建了一個測試程序使用線程:與線程

class First implements Runnable { 
    public void run() { 
     System.out.print("One "); 
    } 
} 

class Second implements Runnable { 
    Thread other; 
    Second(Thread t) {other = t;} 
    public void run() { 
     System.out.print("Two"); 
    } 
} 

public class ThreadTest { 
    void go() { 
     First first = new First(); 
     Thread t = new Thread(first); 
     Second second = new Second(t); 
     Thread u = new Thread(second); 
     t.start(); 
     u.start(); 
    } 

    public static void main(String[] args) { 
     new ThreadTest().go(); 
    } 
} 

我預計它會打印:

一個 一個

但它突然對我來說印:

一個 兩個

我不明白爲什麼會發生這種情況。我認爲在這兩個線程中,必須調用First類的方法run()。因爲我將First實例傳遞給Thread構造函數,然後將創建的線程傳遞給第二個構造函數。因此來自First class的方法run()優先於來自Second class的run()方法。我錯在哪裏?

回答

2

沒有理由爲什麼第二個線程應該打印"One"。它可能與第一個Thread有關,但它對此無能爲力。沒有什麼重寫Secondrun方法,所以它只是打印Two

爲了使第二Thread打印One,有run呼叫中的其他Threadrun方法。

class Second implements Runnable { 
    Thread other; 
    Second(Thread t) {other = t;} 
    public void run() { 
     other.run(); 
    } 
} 

但它是不尋常的,從另一個Threadrun方法調用一個Threadrun方法。實際上,根本不需要直接撥打run

+0

謝謝!我非常無禮 –

1

我預計它會打印:一是之一,但它突然對我印製了:一兩

你開始2個線程。 First.run()方法打印出「One」。方法Second.run()打印出「兩個」。僅僅因爲您在Second構造函數中分配了other = t;並不改變它的run()方法。

因爲我將First實例傳遞給Thread構造函數,然後將創建的線程傳遞給第二個構造函數。因此,來自First類的方法run()優先於來自Second class的run()方法。我錯在哪裏

也許在Second.run()方法你打算叫other.run()什麼?這將是一個奇怪的模式,但不建議。你不應該鏈接Thread這樣的類。你或許應該通過在First方法,然後做:

class Second implements Runnable { 
    First first; 
    Second(First first) { this.first = first; } 
    public void run() { 
     first.run(); 
    } 
} 

但即便如此,這是一個有點陌生的模式,以從另一個調用一個方法run()