通过多个线程处理矩阵的问题

时间:2019-06-26 15:30:11

标签: java arrays multithreading

我正在尝试通过多线程更改矩阵的主要对角线。 每个线程都有一个唯一的编号:21、17、16、26、7。 但是问题是只有一个(通用优先)线程可以工作并且仅更改矩阵的第一个元素。 多线程对我来说是新的。所以我不知道该怎么办。

这来自扩展Thread的类

@Override
   public void run() {

       int[][] m = matrix.getMatrix();
       for (int i = 0; i < m.length; i++) {
           for (int j = 0; j < m[i].length; j++) {
               if ((i == j && m[i][j] == 0) && locker.tryLock()){
                   locker.lock();
                   matrix.setElement(number, i, j);
                   try {
                       TimeUnit.MILLISECONDS.sleep(200);
                   }catch (InterruptedException e){
                       e.printStackTrace();
                   }finally {
                       locker.unlock(); 
                   }
               }
           }
       }
   }

这是来自Matrix类

public void setElement(int element, int i, int j){
    matrix[i][j] = element;
}

这是来自主班

    Thread[] threads = new Thread[numbers.length];
    for (int i = 0; i < numbers.length; i++){
        Thread thread = new Thread(new NumberSetter(matrix, locker, numbers[i]));
        threads[i] = thread;
        thread.start();
    }

    for (int i = 0; i < threads.length; i++) {
        try {
            threads[i].join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:0)

乍一看,您要锁定两次-一次使用locker.tryLock(),再一次使用locker.lock()。删除后者,因为它不需要。 另外,“ m [i] [j] == 0”检查也应位于锁定代码内部。