2017-04-20 108 views
0
Thread thread1; 
thread1 = new Thread() { 
    public void run() { 
     try { 
      Thread.sleep(1700); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 
     System.out.println("testing"); 
    } 
}; 
Thread thread2; 
thread2 = new Thread() { 
    public void run() { 
     try { 
      // ... your code here 
      Thread.sleep(1000); 
      System.out.println("testing"); 
     } catch (InterruptedException ex) { 
      Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
}; 
thread1.start(); 
thread2.start(); 
System.out.println("testing"); 

這是我的程序的一個條紋化的版本,並突出了我需要在它睡覺的時間傳遞的問題,但環顧四周後我似乎無法得到它通過我只能找到有關傳遞給runnable的信息。我需要傳遞一個變量到一個線程

+0

*」我只能找到有關傳遞給runnable的信息。「*你爲什麼認爲有區別? –

+0

「線程」可以與「Runnable」大致相同。然而,如果你想從字面上使用'Runnable',只需按照你的例子,然後使你的線程如下:'thread1 = new Thread(myRunnable)'。這實際上比子類化線程好(就像你有),因爲它更靈活,也因爲它使用聚合而不是繼承(這是實現它的首選方法)。 – markspace

+0

我無法理解它/使它工作。我設法編輯和示例,並可以將它傳遞給runnable,但不能在運行時使用它,這意味着我不能在我的線程的主要部分中使用它,就像我想要的那樣。 – Mrpandygardner

回答

0

嘗試運行下面的類,你有任何問題

public class TestThread { 

    volatile static int time = 1700; 

    public static void main(String[] args) { 


     Thread thread1 = new Thread() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(time); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("Thread1 Sleeped for : " + time + " millis"); 
      } 
     }; 
     thread1.start(); 

     Thread thread2 = new Thread() { 
      @Override 
      public void run() { 
       try { 
        Thread.sleep(time); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("Thread2 Sleeped for : " + time + " millis"); 
      } 
     }; 
     thread2.start(); 
    } 

} 
+0

無論如何,這可以修改爲支持未知數量的線程和不同的時間爲每個人 – Mrpandygardner

+0

正如你所看到的,時間不是最終的變量。所以可以根據需要多次修改它。你也可以在任何線程中使用這個變量 –

+0

但是可能被修改的值可能不會立即對每個線程可見(由於線程緩存)。所以您可能需要將此變量設置爲volatile –

0

你可以嘗試創建一個線程工廠,需要的睡眠時間和您的自定義代碼來執行:

interface CodeExecutor { 
    void execute(); 
} 

static class ThreadFactory { 
    public static Thread newThread(int sleepTime, CodeExecutor customCode) { 
     return new Thread(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        customCode.execute(); 
        Thread.sleep(sleepTime); 
        System.out.println("testing"); 
       } catch (InterruptedException ex) { 
      Logger.getLogger(TestThread.class.getName()).log(Level.SEVERE, null, ex); 
       } 
      } 
     }); 
    } 
} 

public static void main(String[] args) { 
    Thread thread1 = ThreadFactory.newThread(100, new CodeExecutor() { 
     @Override 
     public void execute() { 
      // here goes your custom code 
     } 
    }); 

    thread1.start(); 
    // create other threads 
}