2017-02-11 26 views
0

我想在循環中創建新的Runnable。但是,在內部類中使用變量是不可能的。我不能使用全局/實例變量,因爲它會產生錯誤的結果。我的計劃是類似於下面的代碼的簡化:使用新參數在循環中創建新線程

public class RunManager { 
    public void runManager(int delay, final Context context) { 
     for (int dim = 7; dim < 227; dim++) { 
      Runnable r = new Runnable() { 
       @Override 
       public void run() { 
        RandomKernels randomKernels = new RandomKernels(); 
        try { 
         randomKernels.foo(context, dim); 
        } catch (InterruptedException e) { 
         Log.e(tag, e.getMessage()); 
        } 
       } 
      }; 
      Thread cnnThread = new Thread(r); 
      cnnThread.start(); 
      try { 
       Thread.sleep(delay); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

的錯誤是:Variable 'dim' is accessed from within inner class, needs to be declared final.

+0

你真的想創造220個不同的線程嗎? – BMacedo

+0

@BMacedo感謝您的快速響應。是的,每個線程在5 ms後完成其計算。我正在嘗試執行模擬工作負載來監視硬件特性。 – MTMD

回答

1

你的問題是你想從一個新的線程訪問非final變量。爲了讓變量從新線程接受,它需要被聲明爲final。在你的cas中,你可以將dim int複製到最終的大小爲1的int數組,然後從線程訪問數組。

0

可能最明顯的做法是爲您的Runnable創建一個接受int參數的構造函數。如:

public class MyRunnable implements Runnable { 

    public MyRunnable(Context context, int dim) { 
     // save parameters as class variables 
    } 

    public void run() { 
     // do the work 
    } 
} 

然後調用它:

Runnable r = new MyRunnable(context, dim); 
new Thread(r).start(); 
0

,如果你想訪問內部類中的值,你應該使用final int[] dim

public class RunManager { 

    public void runManager(int delay, final Context context) { 
     for (final int dim[] = {7}; dim[1] < 227; dim[1]++) { 
      Runnable r = new Runnable() { 
       @Override 
       public void run() { 
        RandomKernels randomKernels = new RandomKernels(); 
        try { 
         randomKernels.foo(context, dim[1]); 
        } catch (InterruptedException e) { 
         Log.e(tag, e.getMessage()); 
        } 
       } 
      }; 
      Thread cnnThread = new Thread(r); 
      cnnThread.start(); 
      try { 
       Thread.sleep(delay); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

選擇2 - 使用字段:

public class RunManager { 

    private int _dim; 

    public void runManager(int delay, final Context context) { 
     for (int dim = 7; dim < 227; dim++) { 
      _dim = dim; 
      Runnable r = new Runnable() { 
       @Override 
       public void run() { 
        RandomKernels randomKernels = new RandomKernels(); 
        try { 
         randomKernels.foo(context, _dim); 
        } catch (InterruptedException e) { 
         Log.e(tag, e.getMessage()); 
        } 
       } 
      }; 
      Thread cnnThread = new Thread(r); 
      cnnThread.start(); 
      try { 
       Thread.sleep(delay); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

選項3 - 迭代在另一種方法中,並添加作爲final int dim方法參數:

private void createThreads(int delay, final Object context) { 
    for (int dim = 7; dim < 227; dim++) { 
     runManager(delay, context, dim); 
    } 
} 

public void runManager(int delay, final Context context, final int dim) { 
    Runnable r = new Runnable() { 
     @Override 
     public void run() { 
      RandomKernels randomKernels = new RandomKernels(); 
      try { 
       randomKernels.foo(context, dim); 
      } catch (InterruptedException e) { 
       Log.e(tag, e.getMessage()); 
      } 
     } 
    }; 
    Thread cnnThread = new Thread(r); 
    cnnThread.start(); 
    try { 
     Thread.sleep(delay); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

選項4 - 使用定製可運行的。您可以按照@BMacedo推薦的方式實現類,或者在內部類中創建抽象類並實現邏輯。

public class RunManager { 

    public void runManager(int delay, final Context context) { 
     for (int dim = 7; dim < 227; dim++) { 
      CustomRunnable r = new CustomRunnable() { 
       private int _dim; 

       @Override 
       public void run() { 
        RandomKernels randomKernels = new RandomKernels(); 
        try { 
         randomKernels.foo(context, _dim); 
        } catch (InterruptedException e) { 
         Log.e(tag, e.getMessage()); 
        } 
       } 

       public void setDim(int dim) { 
        _dim = dim; 
       } 
      }; 

      r.setDim(dim); 

      Thread cnnThread = new Thread(r); 
      cnnThread.start(); 
      try { 
       Thread.sleep(delay); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    abstract class CustomRunnable implements Runnable { 
     public abstract void setDim(int dim); 
    } 
}