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,但这并不能让它变得不那么讨厌。我希望这篇文章从我的一些原始描述中得到的是一个强烈的警告,不要这样做。如果他离开的时候还以为我是个混蛋,我可以接受。神经过敏者不应该经常上网。