2015-07-01 1 views
0

Может ли кто-нибудь объяснить, что происходит с элементами данных при поточной передаче? Я имею в виду, что в приведенном ниже коде вывод будет таким, каким я хотел, например имя потока с его соответствующим числом. Однако, если я передаю ссылку 1 потока всем другим потокам, имя потока меняется, но число 50 будет напечатано для всех имен потоков. Почему это происходит?Что происходит с данными в Threading в Java?

class Thread3 implements Runnable 
{ 
int x; 

    public void run() 
    { 
     for(int i=1;i<=5;i++) 
     { 
      System.out.println(Thread.currentThread().getName()+" "+ x); 

      try{ 
       Thread.sleep(1000); 
      }catch(Exception e){ } 
     } 

    } 
} 
public class RunThread3 { 

public static void main(String s[]) 
{ 
Thread3 t1=new Thread3(); 
t1.x=50; 
Thread tt1=new Thread(t1,"thread1"); 
tt1.start(); 

Thread3 t2=new Thread3(); 
t2.x=100; 
Thread tt2=new Thread(t2,"thread2"); 
tt2.start(); 

Thread3 t3=new Thread3(); 
t3.x=150; 
Thread tt3=new Thread(t3,"thread3"); 
tt3.start(); 

for(int i=1;i<=5;i++) 
     { 
      System.out.println(Thread.currentThread().getName()); 
      try{ 
       Thread.sleep(1000); 
      }catch(Exception e){ } 
     } 

} 
} 

Здесь ссылка 1 нить передается всем остальным

class Thread3 implements Runnable 
{ 
int x; 

    public void run() 
    { 
     for(int i=1;i<=5;i++) 
     { 
      System.out.println(Thread.currentThread().getName()+" "+ x); 

      try{ 
       Thread.sleep(1000); 
      }catch(Exception e){ } 
     } 

    } 
} 
public class RunThread3 { 

public static void main(String s[]) 
{ 
Thread3 t1=new Thread3(); 
t1.x=50; 
Thread tt1=new Thread(t1,"thread1"); 
tt1.start(); 

Thread3 t2=new Thread3(); 
t2.x=100; 
Thread tt2=new Thread(t1,"thread2"); 
tt2.start(); 

Thread3 t3=new Thread3(); 
t3.x=150; 
Thread tt3=new Thread(t1,"thread3"); 
tt3.start(); 

for(int i=1;i<=5;i++) 
     { 
      System.out.println(Thread.currentThread().getName()); 
      try{ 
       Thread.sleep(1000); 
      }catch(Exception e){ } 
     } 

} 
} 

ответ

1

В последнем коде вы передаете ссылку нити t1 всем:

Thread3 t1=new Thread3(); 
t1.x=50; 
Thread tt1=new Thread(t1,"thread1"); 
tt1.start(); 
Thread tt2=new Thread(t1,"thread2"); 
tt2.start(); 
Thread tt3=new Thread(t1,"thread3"); 
tt3.start(); 

Это означает, что все нити будет имея значение x как 50, и когда вы выполните код, вы получите ожидаемое значение: thread1 50 thread2 50 main thread3 50 main thread1 50 thread3 50 thread2 50 thread1 50 main thread3 50 thread2 50 thread3 50 main thread2 50 thread1 50 main thread3 50 thread2 50 thread1 50

В первом случае у вас разные темы, и они работают соответственно.

0

Это ваше непонимание резьбы и классов в java. В вашем коде у вас есть 2 разных объекта: java Thread и ваш собственный класс Runnable. Название темы, которую вы получили в своем примере, - это имя объекта темы java Thread. Номер x, который вы получили в своем примере, - это номер вашего настраиваемого класса Runnable. Обратите внимание: я пропустил имя вашего класса - это вызывает недоразумение. Поэтому, если вы используете только один свой настраиваемый объект Runnable, вы всегда получите одно значение x.

Смежные вопросы