14

私は2つの数字を追加するための以下のJavaプログラムを持っています..しかし、私はスレッドを介して開発しようとしていました..私は、最初にT1、T2、T3、T4、T5という名前の5つの異なるスレッドが必要であることを確認していました。 5 つのスレッドが同時に add メソッドを呼び出す必要があります。パフォーマンスが向上するように、5 つのスレッドすべてが同時に add メソッドを呼び出すようにする方法を教えてください。

エグゼキューターフレームワークまたはコントダウンラッチを介してこれを達成する方法を教えてください

public class CollectionTest {

    public static void main(String args[]) {

        //create Scanner instance to get input from User
        Scanner scanner = new Scanner(System.in);

        System.err.println("Please enter first number to add : ");
        int number = scanner.nextInt();

        System.out.println("Enter second number to add :");
        int num = scanner.nextInt();

        //adding two numbers in Java by calling method
       int result = add(number, num);

       System.out.printf(" Addition of numbers %d and %d is %d %n", number, num, result);
    }

    public static int add(int number, int num){
        return number + num;
    }
} 
4

2 に答える 2

18

すべてのスレッドが add を同時に呼び出すことができます。

これは、メソッド内で number 変数と num 変数がそのメソッドに対してのみローカルであり、呼び出し元スレッドに対してもローカルであるためです。number および/または num がグローバルである場合、別の話になります。

編集:

たとえば、この場合:

public static int add(int number, int num){
    //A
    return number + num;
}

スレッドがポイント A に到達すると、2 つの数値が渡されます。

別のスレッドがポイント A に到達すると、渡された独自の異なる番号を使用して独自のバージョンのメソッドが呼び出されます。これは、最初のスレッドが行っていることに影響を与えないことを意味します。

番号はメソッドに対してのみローカルです。

この場合:

static int number;

public static int add(int num){
    //A
    return number + num;
}

スレッドがポイント A に到達すると、渡された num があり、外部番号にはすべてのユーザーがアクセスできるため、外部番号があります。別のスレッドがメソッドに入ると、独自の num を持ちますが (独自のバージョンのメソッドを呼び出すため)、同じ外部番号を使用します。その番号はグローバルであり、すべてにアクセスできるためです。

この場合、スレッドが正しく動作するように特別なコードを追加する必要があります。

于 2013-10-30T04:52:21.697 に答える
3

異なるスレッドが CollectionTest の静的メソッド add を呼び出すときに、これを考えることができます

次に何が起こるか: 例:

public class Test {
/**
 * @param args
 */
public static void main(String[] args) {
    Runnable t1 = new Runnable() {
        public void run() {
            CollectionTest.add(1, 2);
        }
    };

    Runnable t2 = new Runnable() {
        public void run() {
            CollectionTest.add(3, 4);

        }
    };


    new Thread(t1).start();
    new Thread(t2).start();

}
}


public static int add(int number, int num){
    // when different thread call method 
    // for example   
    //  Runnable t1 call ,then "number" will be assigned 1, "num" will be assigned 2
    //  number ,num will keep in thread'stack spack
    return number + num;
}
于 2013-10-30T05:38:15.030 に答える