Java 仅输入第一个线程,不能输入以下线程

Java 仅输入第一个线程,不能输入以下线程,java,multithreading,Java,Multithreading,我想使用几个线程处理数据,但目前只有第一个线程运行,然后它完全停止 我试图打印出线程的名称,但我只输入了第一个线程。即使程序继续运行,它也会停止。它进入同步点。等待()然后停止 public class Solver { final int N; final float[][] data; final CyclicBarrier barrier; class Worker implements Runnable { public int myRow; String

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

我试图打印出线程的名称,但我只输入了第一个线程。即使程序继续运行,它也会停止。它进入
同步点。等待()
然后停止

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;
最终浮动[]数据;
最终循环载体屏障;
类工作者实现可运行的{
myRow公共区域;
字符串名;
公共自行车同步点;
辅助程序(CyclicBarrier屏障,int行,字符串名称){
myRow=行;
this.name=名称;
this.synchPoint=屏障;
这个。run();
}
公开募捐{
System.out.println(“名称:”+Name);
processRow(myRow);
合并行();
试一试{
系统输出打印(“同步点”);
synchPoint.await();
}捕获(中断异常例外){
返回;
}捕获(BrokenBarrierException ex){
返回;
}
}
}
公共void进程行(int numRow){
System.out.println(“在制品行”);
}
公共无效合并行(){
System.out.println(“在合并行中”);
}
公共解算器(浮点[][]矩阵){
数据=矩阵;
N=矩阵长度;
System.out.println(“N:+N”);
可运行路障=
新建Runnable(){public void run(){mergeRows();}};
屏障=新的循环载体(N,屏障作用);
列表线程=新的ArrayList(N);
对于(int i=0;i
输出:

N:5
姓名:工人-0
进程内行
行为:0
数据长度:5
在合并行中
在合并行中
同步点


您有一个讨厌的习惯,就是让构造函数执行初始化实例以外的工作。
Solver
的构造函数这样做并没有最终的危害,但是
Solver.Worker
调用实例的
run()
方法这一事实是问题的根源

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


工作者的构造函数中删除
this.run()
,您应该可以做得更进一步。

除了初始化实例之外,您还有一个让构造函数工作的坏习惯。
Solver
的构造函数这样做并没有最终的危害,但是
Solver.Worker
调用实例的
run()
方法这一事实是问题的根源

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


工作者的构造函数中删除
this.run()
,您应该可以做得更进一步。

我假设这是基于中的示例。您的完整输出是什么?是的,它基于示例。输出:N:5名称:进程行中的工作者-0是:0数据长度:同步点中的合并行中的合并行中的5我怀疑线程。join();必须是。join(),主线程才能等待其他线程完成。我说的对吗?我假设这是基于中的示例。您的完整输出是什么?是的,它基于示例。输出:N:5名称:进程行中的Worker-0行是:0数据长度:5在SynchPoint中的合并行中的合并行我怀疑线程。join();必须是。join(),主线程才能等待其他线程完成。我说得对吗?这种讨厌的习惯很可能是受到了这个词的启发。很可能是这样的,@shmosel,但这并不能让它变得不那么讨厌。我希望这篇文章从我的一些原始描述中得到的是一个强烈的警告,不要这样做。如果他离开的时候还以为我是个混蛋,我可以接受。神经质恐惧症患者不应该经常上网。这种讨厌的习惯很可能是由网络引起的。这很可能是,@shmosel,但这并不能让它变得不那么讨厌。我希望这篇文章从我的一些原始描述中得到的是一个强烈的警告,不要这样做。如果他离开的时候还以为我是个混蛋,我可以接受。神经过敏者不应该经常上网。