【发布时间】:2020-10-17 02:42:19
【问题描述】:
我想用随机整数同时填充nRows * nCols 矩阵的单元格。这里的runnable只是一个setter,它将矩阵的一个单元格设置为一个随机整数。
public class ConcurrentMatrix {
private int nRows;
private int nCols;
private int[][] matrix = new int[nRows][nCols];
private MyConcurrentMatrixFiller myConcurrentMatrixFiller;
public ConcurrentMatrix(int nRows, int nCols, MyConcurrentMatrixFiller filler) {
this.nRows = nRows;
this.nCols = nCols;
this.matrix = new int[nRows][nCols];
Random r = new Random();
for (int row=0; row<nRows; row++) {
for (int col=0; col<nCols; col++) {
Runnable runnable = new Runnable() {
public void run() {
matrix[row][col] = r.nextInt(100);
}
};
filler.execute(runnable); // non-blocking, just depositing runnable in queue.
}
}
}
}
而filler 启动线程池:
public class MyConcurrentMatrixFiller implements Executor {
BlockingQueue<Runnable> channel = new LinkedBlockingQueue<>();
@Override
public void execute(Runnable command) {
channel.offer(command);
}
public MyConcurrentMatrixFiller(int nthreads) {
for (int i=0; i<nthreads; i++) {
activate();
}
}
private void activate() {
new Thread(() -> {
try {
while (true) { channel.take().run(); }
} catch (InterruptedException e) { }
}).start();
}
public static void main(String[] args) {
MyConcurrentMatrixFiller filler = new MyConcurrentMatrixFiller(10);
ConcurrentMatrix cm = new ConcurrentMatrix(10, 10, filler);
}
}
但是,我的 IDE 抱怨 row 和 col 索引应该是最终的。但是我需要每个 runnable 都关心它自己的单元格,那么我怎样才能将这些值提供给 runnable?
【问题讨论】:
-
这是因为您正在创建一个捕获变量的匿名类。您可以简单地编写一个实现 Runnable 的类。或者,也许您可以在声明 Runnable 之前声明两个最终变量并分配它们 i,j,不确定。顺便提一句。对单个随机数使用线程似乎……矫枉过正。也许你想每行/每列做一次?
-
您可以为这两行和 col 声明 final int 并将其传递给线程 final int myRow = row;找到 int myCol = col;矩阵[myRow][myCol]
-
我确定我已经尝试过了..
-
每行有一个线程很好......但它在 100x100 时死掉了......