- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道下面的代码可能看起来很粗俗,但我对这些东西还是陌生的,只是为了让它工作而尝试了一切......
问题:即使我正在使用(可能以错误的方式)一个 CyclicBarrier,一个 - 并且似乎总是相同的 - 线程停止得太快并打印出他的 vector ,留下 11 个“传入连接” "消息不存在。我的循环的最后一次迭代可能存在严重错误,但我似乎无法找到确切的原因。现在程序只是循环等待处理最后一个连接。
public class VectorClockClient implements Runnable {
/*
* Attributes
*/
/*
* The client number is store to provide fast
* array access when, for example, a thread's own
* clock simply needs to be incremented.
*/
private int clientNumber;
private File configFile, inputFile;
int[] vectorClock;
/*
* Constructor
* @param
* - File config
* - int line
* - File input
* - int clients
*/
public VectorClockClient(File config, int line, File input, int clients) {
/*
* Make sure that File handles aren't null and that
* the line number is valid.
*/
if (config != null && line >= 0 && input != null) {
configFile = config;
inputFile = input;
clientNumber = line;
/*
* Set the array size to the number of lines found in the
* config file and initialize with zero values.
*/
vectorClock = new int[clients];
for (int i = 0; i < vectorClock.length; i++) {
vectorClock[i] = 0;
}
}
}
private int parsePort() {
int returnable = 0;
try {
FileInputStream fstream = new FileInputStream(configFile.getName());
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine = "";
for (int i = 0; i < clientNumber + 1; i++) {
strLine = br.readLine();
}
String[] tokens = strLine.split(" ");
returnable = Integer.parseInt(tokens[1]);
}
catch (Exception e) {
e.printStackTrace();
}
System.out.println("[" + clientNumber + "] returned with " + returnable + ".");
return returnable;
}
private int parsePort(int client) {
int returnable = 0;
try {
FileInputStream fstream = new FileInputStream(configFile.getName());
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String strLine = "";
for (int i = 0; i < client; i++) {
strLine = br.readLine();
}
String[] tokens = strLine.split(" ");
returnable = Integer.parseInt(tokens[1]);
}
catch (Exception e) {
e.printStackTrace();
}
return returnable;
}
private int parseAction(String s) {
int returnable = -1;
try {
FileInputStream fstream = new FileInputStream(configFile.getName());
DataInputStream in = new DataInputStream(fstream);
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String[] tokens = s.split(" ");
if (!(Integer.parseInt(tokens[0]) == this.clientNumber + 1)) {
return -1;
}
else {
if (tokens[1].equals("L")) {
vectorClock[clientNumber] += Integer.parseInt(tokens[2]);
}
else {
returnable = Integer.parseInt(tokens[2]);
}
}
}
catch (Exception e) {
e.printStackTrace();
}
return returnable;
}
/*
* Do the actual work.
*/
public void run() {
try {
InitClients.barrier.await();
}
catch (Exception e) {
System.out.println(e);
}
int port = parsePort();
String hostname = "localhost";
String strLine;
ServerSocketChannel ssc;
SocketChannel sc;
FileInputStream fstream;
DataInputStream in;
BufferedReader br;
boolean eof = false;
try {
ssc = ServerSocketChannel.open();
ssc.socket().bind(new InetSocketAddress(hostname, port));
ssc.configureBlocking(false);
fstream = new FileInputStream("input_vector.txt");
in = new DataInputStream(fstream);
br = new BufferedReader(new InputStreamReader(in));
try {
InitClients.barrier.await();
}
catch (Exception e) {
System.out.println(e);
}
while (true && (eof == false)) {
sc = ssc.accept();
if (sc == null) {
if ((strLine = br.readLine()) != null) {
int result = parseAction(strLine);
if (result >= 0) {
//System.out.println("[" + (clientNumber + 1)
//+ "] Send a message to " + result + ".");
try {
SocketChannel client = SocketChannel.open();
client.configureBlocking(true);
client.connect(
new InetSocketAddress("localhost",
parsePort(result)));
//ByteBuffer buf = ByteBuffer.allocateDirect(32);
//buf.put((byte)0xFF);
//buf.flip();
//vectorClock[clientNumber] += 1;
//int numBytesWritten = client.write(buf);
String obj = Integer.toString(clientNumber+1);
ObjectOutputStream oos = new
ObjectOutputStream(
client.socket().getOutputStream());
oos.writeObject(obj);
oos.close();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
else {
eof = true;
}
}
else {
ObjectInputStream ois = new
ObjectInputStream(sc.socket().getInputStream());
String clientNumberString = (String)ois.readObject();
System.out.println("At {Client[" + (clientNumber + 1)
+ "]}Incoming connection from: "
+ sc.socket().getRemoteSocketAddress()
+ " from {Client[" + clientNumberString + "]}");
sc.close();
}
try {
InitClients.barrier.await();
}
catch (Exception e) {
e.printStackTrace();
}
}
}
catch (Exception e) {
e.printStackTrace();
}
printVector();
}
private void printVector() {
System.out.print("{Client[" + (clientNumber + 1) + "]}{");
for (int i = 0; i < vectorClock.length; i++) {
System.out.print(vectorClock[i] + "\t");
}
System.out.println("}");
}
}
为澄清起见,这里是所用文件的格式。 Config 包含客户端使用的主机名和端口,这些客户端是线程,输入文件的行表示“该客户端向该客户端发送消息”或“该客户端将其逻辑时钟递增某个常量值”。
1 M 2(M表示发送消息)
2米3
3米4
2 L 7 (L表示递增时钟)
2米1
...
127.0.0.1 9000
127.0.0.1 9001
127.0.0.1 9002
127.0.0.1 9003
...
最佳答案
我会查看与您何时期待传入套接字连接相关的逻辑。从您的问题看来,您似乎期望一定数量的传入套接字连接(可能是在每条传出消息之后都有一个传入连接?)。由于您在传入套接字上使用非阻塞 I/O,因此您的 while 语句总是有可能在建立传入套接字之前循环。结果,线程将能够继续并从文件中读取下一行而无需接收连接。由于一旦到达文件末尾就达到了结束状态,因此您可能会错过传入的套接字连接。
我会添加一些简单的打印输出,当您从文件中读取时、发送消息时以及收到传入连接时显示。这应该很快告诉您特定线程是否缺少预期的传入连接。如果事实证明问题是由于非阻塞 I/O 引起的,那么您可能需要在期望传入套接字时禁用非阻塞 I/O,或者实现一个控件来跟踪您期望的传入套接字数量并继续,直到达到该目标。
希望这对您有所帮助。
关于java - 不管 CyclicBarrier 有一个线程停止得太早,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4964872/
运行以下代码时,2个启动线程将被CyclicBarrier *对象锁定,并无限等待第三个线程解锁 import java.util.concurrent.BrokenBarrierException;
介绍 CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。 就比如说我
一 点睛 1 定义 CyclicBarrier 可以用于解决多个线程之间的相互等待问题。CyclicBarrier 的使用场景是,每个线程在执行时,都会碰到屏障,该屏障会拦截所有线程的执行(通过 aw
我正在尝试使用 CyclicBarrier 模拟铁人三项比赛,但它没有按预期工作,我也不知道为什么。 比赛的每一部分都要等到所有跑者都完成上一部分后,但似乎永远在等待。 这是第一阶段的代码片段: cl
下面的代码似乎不是并行运行的,而是在每个单独的线程上调用 wait() 方法的情况下,在另一个请求之后发出一个请求。有人可以帮助并行调用该线程吗? public class XYZ { priv
我正在实现一个并行算法。如果没有 CyclicBarrier,我可以用一半的顺序时间完成工作。使用 CyclicBarrier 会使时间延长 100 倍。我将包括我的线程调用和线程函数,以便您可以看到
在这种情况下,CyclicBarrier 是否最适合。 我想在 Stages 中并行运行 n 个线程(在 Stages 等待直到所有线程完成该 Stage)。 public class
我想使用 CyclicBarrier 对象作为静态成员,我有多个线程正在运行,它将修改 CyclicBarrier 对象状态,这样做安全吗? 最佳答案 CyclicBarrier 的全部意义在于同步多
我正在尝试通过在启动(等待)几个方(线程)的过程中重置 cyclicbarrier 来测试 BrokenBarrierException,请在下面找到相同的示例代码。 用户类: public clas
我有一个使用 CyclicBarrier 的方法,如下所示: public void getMessage(Message obj){ CyclicBarrier barrier = new
我正在寻找 CyclicBarrier我写了这个演示。 import java.util.concurrent.BrokenBarrierException; import java.util.con
当在 Java 中使用 CyclicBarrier 同步线程时,它们是否同步非 volatile 变量? int a = 0; int b = 0; CyclicBarrier barrier = n
我有一个函数可以将数组分割成更小的部分。 然后在单独的线程中评估每个部分。 结果被填充到一个公共(public)列表中。 private void sortandkeep(int[] arr){
上一篇咱讲了 CountDownLatch 可以解决多个线程同步的问题,相比于 join 来说它的应用范围更广,不仅可以应用在线程上,还可以应用在线程池上。然而 CountDownLatch 却
栅栏类似闭锁,但是它们是有区别的. 1.闭锁用来等待事件,而栅栏用于等待其他线程.什么意思呢?就是说闭锁用来等待的事件就是countDown事件,只有该countDown事件执行后所有之前在等待的
我在jdk1.8中分析了代码,但在其他jdk版本中可能有同样的问题 让我们假设以下代码中的partys = 3 CyclicBarrier cb = new CyclicBarrier(3); par
我正在努力实现以下目标: 获取用户的两个输入( length 和 amountOfCycles ) 创建一个包含 length 的数组线程数量。每个包含一个整数 value在 [1, 100] 范围内
对于我的家庭作业,我必须制作一个由几个国王在棋盘上移动的游戏。每个国王必须在自己的线程中从其独特的起始位置移动到独特的结束位置。在采取行动之前,国王必须 hibernate 长达 10 毫秒(有点随机
我知道下面的代码可能看起来很粗俗,但我对这些东西还是陌生的,只是为了让它工作而尝试了一切...... 问题:即使我正在使用(可能以错误的方式)一个 CyclicBarrier,一个 - 并且似乎总是相
在 CyclicBarrier.reset javadocs,以下提到。 Note that resets after a breakage has occurred for other reason
我是一名优秀的程序员,十分优秀!