【问题标题】:java thread start not workingjava线程启动不工作
【发布时间】:2017-10-01 13:23:19
【问题描述】:

我有一个涉及线程的简单练习。

(a) 创建一个名为 SumAction 的类来实现 Runnable。 该类包含 3 个实例变量 - start、end 和 sum。 start 和 end 由构造函数初始化。总和设置为 0。

(b) run() 方法应该有一个 for 循环,它应该找到从开始到结束的所有值的总和。应该有一个方法 getSum() 来返回 sum 的值。

(c) 在 main 中创建这个 Runnable 类的 2 个实例,一个以 1 和 10 作为参数,另一个以 10 和 20 作为参数。

(d) 将这些实例传递给 2 个线程构造函数以创建线程 t1 和 t2。

(e) 线程完成后,调用 getSum 从两个线程中获取总和值以求总和。

我很确定我做对了,但我仍然得到 0 的总和值。

这是我的课

public class SumAction implements Runnable {

private int start, end, sum;

public SumAction(int start, int end) {
    this.start = start;
    this.end = end;
    sum = 0;
}

@Override
public void run()
{

    for (int i = start+1; i < end; i++)
    {
      sum += i;  
    }

}

public int getSum() {
    return sum;
}
}

这里是主要的

    SumAction run1 = new SumAction(1, 10);

    SumAction run2 = new SumAction(10, 20);

    Thread t1= new Thread(run1);

    Thread t2= new Thread(run2);


    t1.start();

    t2.start();


    System.out.println("Sum 1 : " + run1.getSum());

    System.out.println("Sum 2 : " + run2.getSum());

【问题讨论】:

  • 您可能在线程完成之前打印总和。
  • 对两个线程使用连接方法

标签: java multithreading runnable


【解决方案1】:

您不是在等待线程完成。您的主线程可以在其他线程完成计算之前或甚至在它们开始之前调用 getSum。此外,即使线程恰好在 println 之前完成,主线程也可能看不到更新的值。

在线程上调用 join 以等待它们完成,在启动线程之后和 printlns 之前添加:

t1.join();
t2.join();

这可以确保主线程等到其他线程完成后再尝试打印总和,并且还可以解决可见性问题。

在许多情况下,如果有足够的预防措施(同步、使字段易失性等)不采取。但是在此代码中,如果您调用 join 则不需要额外的同步来确保主线程看到 getSum 的最新值,因为有一个适用的先发生规则。引用自Oracle tutorial

当一个线程终止并导致另一个线程中的 Thread.join 返回时,被终止线程执行的所有语句与成功连接之后的所有语句都具有发生前的关系。执行连接的线程现在可以看到线程中代码的效果。

join 方法抛出 InterruptedException,这是一个检查异常,如果线程在设置了其中断标志后进入睡眠或等待状态,则抛出该异常。对于一个简单的示例程序,您实际上不会中断任何内容,您可以将其添加到 main 方法的 throws 子句中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 2021-01-14
    • 2014-08-18
    • 1970-01-01
    • 2018-09-16
    相关资源
    最近更新 更多