2012-05-18 21 views
7

Java'da yeni başlayan bir girişimciyim ve çok iş parçacıklı uygulamalara rastladım. Bu sorunun burada bazı yayınlara benzediğini biliyorum ancak sorgum için daha iyi bir yanıt bulamadım. Temel olarak, bir nesneyi statik bir yönteme iletmek istiyorum ve yöntem, yalnızca nesnenin değerlerine/özelliklerine dayanarak bir çıktı döndürecektir. Her çağrı için, nesnenin yeni bir örneğini oluşturuyorum ve herhangi bir şekilde, yöntemin içindeki nesneyi değiştirecek hiçbir şansım yok. Şimdi, benim sorum, JVM statik yönteminin ve yerel değişkenlerinin yeni bir örneğini, birden çok iş parçacığı tarafından her çağrı için Yığında (nesne yığınta olacak şekilde hariç) oluşturacak mı? Ben ne elde etmek istediğinizi net bir görünüm için, burada benim kodudur:Bir nesne başvurusunu statik yardımcı yönteme geçiren çok sayıda Konu

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; 
    } 
} 

ÇIKIŞ:

Eşzamanlı bir anahtar kelime koymadığımdan E çıkışı her zaman farklı olacaktır ve aşağıdaki benzer: (çıkış doğrudur ve tam olarak ben bekliyorum, ne ben sadece ben eşitleme kullanmak istemiyorsanız beri doğru yolda olduğumu açıklamak istiyorum statik yöntemini çağırabilirsiniz önce her iş parçacığı bitirmek diğer iş, beklemek zorunda kalacak çünkü

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

+1 - Harika ilk soru! StackOverflow'a hoş geldiniz! – jmort253

cevap

4

statik yöntem ve yerel yeni bir örneğini oluşturmak JVM olacaktır) sürecini yavaşlatacaktır değişkenler, her bir çağrı için birden fazla iş parçacığı için Yığın içine (nesne yığınta olacak şekilde hariç) mi?

Evet, tam olarak doğru.

Statik bir yöntem yalnızca yerel değişkenlere başvurursa, otomatik olarak güvenli bir şekilde işlenir. (Aslında bu hem statik olmayan yöntemler için geçerlidir.)

Genellikle olsa konuşmak gerekirse, mümkünse sen static kaçınmalısınız söyleyebilirim. Genel olarak, statik üyelerin bir anlamda küresel olduğu gerçeğinden ötürü test etmek ve akıl yürütmek için kodu zorlaştırır.

+0

'statik 'yöntemleri, kullanımı gayet iyi ve mantıklıdır. Örneğin, 'Math.min'. Yani Math.PI gibi sabitler. Sadece son halindeki "statik" değişkenlerden kaçınıyorlar, her türlü çok iş parçacıklılık hatasına neden oluyorlar. Çok hızlı yanıt için –

+0

teşekkürler. Bu aslında elde etmek istediğim şey. Yardımcı yöntemin, herhangi bir iş parçacığının her zaman arayabileceği global bir yöntem gibi davranmasını istiyorum. Benim ilk tasarım aslında yöntem normal bir sınıfın içinde idi ve sonra her bir iş parçacığı sınıfın bir örneğini oluşturur ve sonra yöntemi çağırır. Benim asıl statik metodumun içinde çok fazla mantık var ve her seferinde yeni bir örnek oluşturduğumda performans konusunda endişeleniyorum. ama yukarıda gösterdiğim gibi, yöntem kendisine iletilen nesneyi değiştirmeyecek. Bu şekilde devam edersem, statik yöntemler kullanarak daha iyi olur mu? –

+0

@PopoyMakisig, cevap vermek gerçekten zor bir soru. Ben bir zamanlar, burada ve orada yararlı şeyler yapmak için her yerde dolaşmak zorunda kaldığım oldukça merkezi bir sunucu olan bir sunucu yazdım. Ben bıktım ve statik yöntemler oluşturdum. İlk başta büyük bir sadeleştirme gibi görünüyordu, ama sonunda karardan pişman oldum ve geri döndü. Senin yerinde olsaydım, bunu denerdim, nasıl çalıştığını görecektim. Eğer iş yaparsa onunla mutlu ol, bir ders olarak kabul et, eğer geri dönersen, sonunda, – aioobe

4

static yöntemleri yalnızca static değişkenler iş parçacığı üzerinde paylaşılacaktır bir sorun değildir.

public static int sum(int a, int b) { 
    int tmp = a + b; 
    return tmp; 
} 

çağırma

Yani iki konu sorunlarla yayınlanmaz. bir iplik Anothers tmp değeri üzerine yazabilir çünkü

static int tmp; 

public static int sum(int a, int b) { 
    tmp = a + b; 
    return tmp; 
} 

, çok kanallı başarısız olacak. Hatta static yöntemlerde

Yerel değişkenler, hala yerel ve böylece güvenlidir. static yöntemleri kullanarak

iyidir. Yöntemin nesne değişkenlerine erişim gerektirmediğini vurgular.static sabit olmayan değişkenleri kullanmak hatalara eğilimlidir, bunu her ne pahasına olursa olsun önler (ve değişkene erişmeniz gerekiyorsa sabitlemeyi senkronize edin).

+0

, herhangi bir statik sabit olmayan değişken kullanamayacağım. Tanımlanmış sabitlere ihtiyacım varsa, sadece son statik değişkenleri kullanıyorum. Yani her şey şu anda düz ileri. Java'nın eşzamanlılık özelliği zaten benim için çok net olduğunda senkronizasyon ve/veya örnek yöntemleri kullanacağım. cevabın için teşekkürler. –

+0

Hayatımı bu cümle ile kurtardın: "Yerel değişkenler, statik yöntemlerde bile, hala yerel ve güvenlidir." Bu cevaba şaşırdım. Sezgisel olarak yanlış geliyor, ama şükürler olsun ki değil! – aliteralmind

+0

Bir kişi derleyicilerle çalıştığı zaman oldukça açık olmalı. Yerel değişkenler '' yığınında '' depolanır; ve her bir iş parçacığının mutlaka kendi yığını olduğu için, birbirlerinin yerel değişkenlerini göremezler. Aslında, mevcut yığın işaretçisine göre sıralanırlar - bu nedenle, aynı yığında da birden çok kopya olabilir. Aksi takdirde, özyineleme de düzgün çalışmayabilir. –

İlgili konular