私はちょうどJavaの初心者であり、マルチスレッドアプリケーションに遭遇しました。私はこの質問がここのいくつかの記事に似ていることを知っていますが、私は私の質問に対してより良い答えを見つけることができませんでした。基本的には、静的メソッドにオブジェクトを渡したいのですが、そのメソッドはオブジェクトの値/プロパティに基づいて出力を返します。すべての呼び出しについて、私はオブジェクトの新しいインスタンスを作成しているので、メソッドの中のオブジェクトを変更する機会はまったくありません。さて、私の質問は、JVMは、静的メソッドとそのローカル変数の新しいインスタンスを、複数のスレッドが呼び出すたびにスタックに(オブジェクトをヒープ上に置くように)除外しますか?私が達成したいものを明確に表示するために、ここに私のコードです:オブジェクト参照を静的ヘルパーメソッドに渡す複数のスレッド
TestConcurrent.java
import classes.Player;
public class TestConcurrent
{
private static int method(Player player)
{
int y = (player.getPoints() * 10) + 1;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {}
return ++y;
}
public static void main(String[] args) throws Exception
{
// Create 100 threads
for(int i=1;i<=100;i++)
{
final int j = i;
// Create a new Thread
new Thread()
{
public void run()
{
// Create a new instance of the Player class
Player player = new Player(j,j,"FirstName" + j, "LastName" + j);
// Call static method() and pass a new instance of Player class
System.out.println("Thread " + j + ": " + TestConcurrent.method(player));
// Check the values of the Player class after the call to the static method()
System.out.println("Player" + player.getAcctId() + " : Points=" + player.getPoints() + " Name=" + player.getFirstName() + " " + player.getLastName());
}
}.start();
}
}
}
Player.java
package classes;
public class Player
{
private int acctId, points;
String firstName, lastName;
public Player(int acctId, int points, String firstName, String lastName)
{
this.acctId = acctId;
this.points = points;
this.firstName = firstName;
this.lastName = lastName;
}
public int getAcctId() {
return acctId;
}
public void setAcctId(int acctId) {
this.acctId = acctId;
}
public int getPoints() {
return points;
}
public void setPoints(int points) {
this.points = points;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
OUTPUT:
私はsynchronizedキーワードを入れていないので、th出力は毎回異なり、以下のようになります:(出力は正しいですが、まさに私が期待していることですが、私は正しいパスにあることを明確にしたいのですが、同期を使用したくないからです。それは、静的メソッドを呼び出すことができます前に、各スレッドが終了する他のスレッドを待つ必要がありますので、それは
Thread 2: 22
Player8 : Points=8 Name=FirstName8 LastName8
Thread 22: 222
Thread 26: 262
Thread 23: 232
Player23 : Points=23 Name=FirstName23 LastName23
Thread 21: 212
Player21 : Points=21 Name=FirstName21 LastName21
Thread 25: 252
Player25 : Points=25 Name=FirstName25 LastName25
Thread 20: 202
Thread 19: 192
Thread 24: 242
Player24 : Points=24 Name=FirstName24 LastName24
Player9 : Points=9 Name=FirstName9 LastName9
Thread 28: 282
+1 - すばらしい最初の質問! StackOverflowへようこそ! – jmort253