当前位置: 首页 > 知识库问答 >
问题:

为什么join()现在在这里工作?

江仲渊
2023-03-14

这是我的线程:

public class MyThread implements Runnable {
//Limits
int lowerLimit;
int upperLimit;
MyInteger result;

//Constructor
public MyThread(int lowerLimit, int upperLimit, MyInteger result){
    this.lowerLimit = lowerLimit;
    this.upperLimit = upperLimit;
    this.result = result;
}

@Override
public void run() {

    //Sums up the numbers in the given interval
    for(int i= lowerLimit; i <= upperLimit;i++){
        result.add(i);
    }
}

}

它得到一个上限和下限以及一个在所有线程上共享的结果。

这是我的测试类:

public class Sum {

public static long sumThreads(int numberThreads, int n) {

    Thread[] threads = new Thread[numberThreads];
    MyInteger result = new MyInteger(0);

    // Creates new threads and starts them
    for (int i = 0; i < numberThreads; i++) {
        threads[i] = new Thread(new MyThread(i * n / numberThreads + 1,
                (i + 1) * n / numberThreads, result));
        threads[i].start();
    }

    // Waits for all thread to continue with the return
    for (int i = 0; i < threads.length; i++) {
        try {
            threads[i].join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    return result.getValue();
}

public static void main(String[] args) {
    System.out.println(sumThreads(10, 1000));
}

}
public MyInteger(int value) {
    this.value = value;
}

public long getValue() {
    return value;
}

public void setValue(int value) {
    this.value = value;
}

public void add(int summand){
    value += summand;
}

public void sub(int decr){
    value -= decr;
}

public void increase(){
    value++;
}

public void decrease(){
    value--;
}
}

共有1个答案

陈刚洁
2023-03-14

您的联接代码看起来正确。我怀疑您的代码正在经历竞争危险:

关于争用条件的Wiki页面

当您有多个线程同时运行(所有线程都在修改共享资源)时,您需要确保它们在执行修改时具有独占访问权。

    null
 类似资料:
  • 问题内容: 我应该开发一个简单的SFTP。 一切都进行得很好,直到我(在本例中)没有编写全部为止。可以请我解释一下,为什么系统挂在我身上吗? 服务器端: 客户端: 问题答案: 您的循环一直运行到流结束,但是对等方永远不会关闭套接字。该协议似乎要求打开套接字以供其他命令使用,因此您必须调整它的这一部分以包括一个长度字前缀,以便您知道要复制多少字节。 问题不是关于不写所有字节,而是关于阻塞in 。

  • 问题内容: 我正在尝试通过以下方式将日期范围划分为各个日期: 而且我不知道为什么不起作用,因为日期仍然相同,所以循环变得无限。 问题答案: plusDays不会改变原始的,您必须分配结果:

  • 测试代码为: 测试代码为: 你知道怎么了吗?

  • 我遇到JSON解析错误。我的代码如下: 我从我的检查中得到以下错误: 由于:com,无法分析JSON。谷歌。格森。JsonSyntaxException:java。lang.IllegalStateException:应为BEGIN\u对象,但在第1行第2列为BEGIN\u数组 对于我试图读取的JSON,如果成功,我的应该返回5。 我做错了什么?

  • 问题内容: 我刚读 ISO / IEC 9899:201x委员会草案-2011年4月12日 在其中我发现5.1.2.2.3程序终止 这表示如果您未在中指定任何return语句,并且如果程序成功运行,则main的右大括号}将返回0。 但是在下面的代码中,我没有指定任何return语句,但是它没有返回0 编译 问题答案: 该规则是在C标准的1999版本中添加的。在C90中,返回的状态未定义。 您可以通

  • 我有以下方法调用层次结构 在上面的场景中,我的期望是Spring应该在线程从Method od1出来时提交事务,或者如果在层次结构中的任何位置发生异常,则回滚。 但是Spring在方法2中执行更新后立即提交事务。我不明白为什么? 更新:-即使我将事务更改为事务(传播=传播。需要\u NEW),它仍会提交事务。所以没有影响