1
  1. name、mark1、mark2、mark3、および sum 変数を使用して Student クラスを作成します。
  2. いくつかの値を持つ 4 つの学生オブジェクトで ArrayList を作成します。
  3. MarkEvaluation スレッドと ShowMark スレッドを作成します。
  4. MarkEvaluation は、各学生の合計点の計算を実行する必要があります。
  5. ShowMark スレッドは、計算された合計を表示する必要があります。
  6. Join メソッドを使用して、MarkEvaluation の前に ShowMark スレッドが実行されないようにします。

宿題ではありません。いくつかの練習の一部です。ここでは、異なることを行う 2 つのスレッドを実行するように求められましたが、2 つの run() メソッドを実行できるかどうかわかりません。2 つの異なる操作を実行するにはどうすればよいですか? 申し訳ありませんが、スレッドを学習し始めたばかりです。これは私が行ったことですが、不完全です。

import java.util.*;

class Student implements Runnable
 {
 public Student()
 {
     List<Object> list = new ArrayList<Object>();
     list.add("robin");
     list.add("ravi");
     list.add("raj");
     list.add("sam");
 }
 String name;
 int mark1=30,mark2=45,mark3=70,sum=0;

 public void run()
  {
    sum = mark1+mark2+mark3;
  }

}

public class Ch3Lu2Ex3
 {
  public static void main(String[] args) 
  {
    Student stu = new Student();
    Thread MarkEvaluation = new Thread(stu);
    MarkEvaluation.start();
    Thread ShowMark = new Thread();

}
}
4

3 に答える 3

1

次のように変更します

class Student implements Runnable {
...
}

class ShowMarkThread extends Thread {
    private final int sum;

    ShowMarkThread(int sum) {
        this.sum = sum;
    }

    @Override
    public void run() {
        System.out.println(sum);
    }
}

public class Ch3Lu2Ex3 {

    public static void main(String[] args) throws Exception {
        Student stu = new Student();
        Thread markEvaluation = new Thread(stu);
        markEvaluation.start();
        markEvaluation.join();
        new ShowMarkThread(stu.sum).start();
    }
}

その上、StudentとMarkEvaluationThreadの2つの別々のクラスを作成することをお勧めしますStudent implements Runnable

于 2013-01-13T05:31:15.903 に答える
1

@dicarlo2 が述べたように、BlockingQueue も問題を解決します。しかし、あなたはこの質問について間違った方法で取り組んでいると思います。これが私のマルチスレッドソリューションです。ShowMark クラスに System.out.println ステートメントを追加して、魔法が機能していることを確認しました。また、学生が順不同で印刷されることも時々あります。これが役立つことを願っています!

import java.util.ArrayList;
import java.util.List;


public class Main {

  public static void main(String[] args) {
    List<Student> students = new ArrayList<Student>();
    students.add(new Student("Alice", 10, 20, 30));
    students.add(new Student("Bob", 20, 30, 40));
    students.add(new Student("Carol", 30, 40, 50));
    students.add(new Student("Robin", 40, 50, 60));
    for (Student s : students) {
      Thread mkThread = new MarkEvaluation(s);
      mkThread.start();
      //Must at least start thread before starting ShowMark. 
      Thread smThread = new ShowMark(s, mkThread);
      smThread.start();
    }
  }

  private static class Student {
    String name;
    double mark1, mark2, mark3, sum;

    public Student(String name, double mark1, double mark2, double mark3) {
      this.name = name;
      this.mark1 = mark1;
      this.mark2 = mark2;
      this.mark3 = mark3;
    }
  }

  private static class MarkEvaluation extends Thread {
    Student stu;
    public MarkEvaluation(Student stu) {
      this.stu = stu;
    }
    @Override
    public void run() {
      super.run();
      stu.sum = stu.mark1 + stu.mark2 + stu.mark3;
    }
  }

  private static class ShowMark extends Thread {
    Thread thread;
    Student stu;
    public ShowMark(Student stu, Thread thread) {
      this.stu = stu;
      this.thread = thread;
    }
    @Override
    public void run() {
      super.run();
      // A thread is alive if it has been started and has not yet died.
      while (thread.isAlive()) {
        try {
          System.out.println("Waited for thread: " + thread.toString() + " to finish.");
          thread.join();
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
      System.out.println(stu.name + " " + stu.sum);
    }
  }

}
于 2013-01-13T06:14:58.837 に答える
1

あなたは正しい軌道に乗っています。ここでやりたいことは、結果の合計を表示するための別のクラスを作成することであり、計算された合計をスレッドRunnableから共有する何らかの方法を見つける必要があります。を使用することをMarkEvaluationお勧めします.BlockingQueuetake()sumputjoin()

明示的に、 を実装する 2 つのクラスが必要ですRunnable。1 つは既に持っており、もう 1 つは結果を表示するためのものです。それらの間でa を共有する必要があり、 a をインスタンス化してを呼び出しBlockingQueueて両方のスレッドを開始する必要があります。これにより、単にコードを提供することなく、正しい方向に進むことができれば幸いです。Threadstart()

または、スレッド上で実行に使用されたスレッド(上記で呼び出された)ShowMark Runnableへの参照を保持し、 (または同様の) を呼び出して から合計を取得することもできます。StudentStudentMarkEvaluationjoingetSum()Student

于 2013-01-13T05:16:12.113 に答える