2015-02-10 98 views
3

我有一個類,它有一個每10秒運行一次的作業,如下面的代碼塊所示。然而,在Runnable()中,我無法訪問該類的對象。我假設它與Java中的線程安全有關。Java Runnable訪問一個類的對象

如果我實現Runnable,那麼我將不得不提供run()函數。我真的不想這樣做。我想要做的是讓這個類有它自己的正常功能,但是隻要這個工作在其中每X秒運行一次,並訪問該類的LinkedList。我的跑步數據包含在scheduleAtFixedRate中,而不是課程本身。

任何想法?

public class MyClass { 

    private volatile LinkedList<String> words; 

    public MyClass() { 
     this.words = new LinkedList<String>(); 
     this.cleanup(); 
    } 

    public void cleanup() { 
     ScheduledExecutorService exec = Executors.newSingleThreadScheduledExecutor(); 
     exec.scheduleAtFixedRate(new Runnable() { 
      @Override 
      public void run() { 
       // can't access this.words here 
       } 
      } 
     }, 0, 10, TimeUnit.SECONDS); 
    } 
+0

請注意,'volatile'在這裏很可能是錯誤的。如果你想訪問'words'的元素,那麼你需要使用鎖定/同步或線程安全的數據結構。如果您想從Runnable中分配/替換整個單詞變量,則只能使用'volatile'。 – jmiserez 2018-02-27 12:13:56

回答

5

使用MyClass.this.words,或者只是words

可以使用X.this訪問this對外部類X的引用。如果外部類是匿名類(在這種情況下不是這樣),這不起作用。

或者,您可以只使用words而不使用something.words - 與this一樣,編譯器將自動使用X.this

+0

我使用的一個類似的技巧就是在匿名內部類創建之前做一個'final MyClass that = this',你可以將'words'作爲'that.words'來訪問。 (有時候你會將''看作'父'或'來電者'。) – 2015-02-10 01:09:04