gpt4 book ai didi

java - 只能进入第一个线程,不能进入后续线程

转载 作者:行者123 更新时间:2023-12-01 16:50:30 25 4
gpt4 key购买 nike

我想使用多个线程处理数据,但目前只有第一个线程运行,然后它完全停止。

我正在尝试打印出线程的名称,但我只输入第一个线程。即使程序继续运行,它也会停止。它进入 synchpoint.await() 然后停止。

public class Solver {
final int N;
final float[][] data;
final CyclicBarrier barrier;

class Worker implements Runnable {
public int myRow;
String name;
public CyclicBarrier synchPoint;

Worker(CyclicBarrier barrier, int row, String name) {
myRow = row;
this.name = name;
this.synchPoint = barrier;
this.run();
}

public void run() {
System.out.println("Name: " + name);
processRow(myRow);
mergeRows();

try {
System.out.print("In SynchPoint");
synchPoint.await();
} catch (InterruptedException ex) {
return;
} catch (BrokenBarrierException ex) {
return;
}
}
}

public void processRow(int numRow){
System.out.println("In Process Row");
}

public void mergeRows(){
System.out.println("In merge Row");
}

public Solver(float[][] matrix) {
data = matrix;
N = matrix.length;
System.out.println("N: " + N);
Runnable barrierAction =
new Runnable() { public void run() { mergeRows(); }};
barrier = new CyclicBarrier(N, barrierAction);

List<Thread> threads = new ArrayList<Thread>(N);
for (int i = 0; i < N; i++) {
String myName = "Worker-" + i;
Thread thread = new Thread(new Worker(barrier, i, myName));
threads.add(thread);
thread.start();
System.out.println("In loop, i is: " + i);
}

// wait until done
for (Thread thread : threads)
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public static void doWork(){
float[][] matrix2 = new float[6][2000];
Solver solve = new Solver(matrix2);
}

public static void main(String[] args) {
Solver.doWork();
}
}

输出:

N: 5
Name: Worker-0
In Process Row
Row is: 0
Data Length: 5
In merge Row
In merge Row
In SynchPoint

最佳答案

您有一个令人讨厌的习惯,即让构造函数执行初始化实例以外的工作。 Solver 的构造函数执行此操作并不是最终有害的,但事实上 Solver.Worker 会调用实例的 run() 方法是你问题的根源。

您在应用程序的主线程中运行 Worker 构造函数。该构造函数调用 run(),当线程到达 synchPoint.await() 时,它会挂起线程。当足够多的其他线程到达该点时,该线程将恢复,但没有一个线程会恢复,因为执行该操作的一个线程是创建并启动其他线程的线程,并且它无法继续。

Worker 的构造函数中删除 this.run(),您应该会得到更多。

关于java - 只能进入第一个线程,不能进入后续线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41049148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com