在线程中使用Java进行数据成员会发生什么?

时间:2015-07-01 09:20:51

标签: java

任何人都可以解释一下线程中数据成员会发生什么吗?我的意思是在下面的代码中输出是我想要的,即线程名称及其对应的数字。但是,如果我将1个线程的引用传递给所有其他线程,则线程名称会有所不同,但是为所有线程名称打印的数字为50。为什么会这样?

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){ }
        }   

}
}

2 个答案:

答案 0 :(得分: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

在前一种情况下,您拥有不同的线程并且它们相应地工作。

答案 1 :(得分:0)

这是你对java中的线程和类的误解。 在您的代码中,您有两个不同的实体:java Thread和您的自定义Runnable类。 您在示例中获得的线程名称是java Thread对象的名称。您在示例中获得的数字Sub CopyTotalSalesPrice() For Each Worksheet In ActiveWorkbook.Worksheets If Worksheet.Name <> "Summary" Then Worksheet.Cells(Rows.Count, 7).End(xlUp).Select End If If Selection.Value > "0" Then Selection.Copy Worksheets("Summary").Cells(Rows.Count, 6).End(xlUp).Offset(2, 0).PasteSpecial (xlPasteValues) Range("D4").Select Selection.Copy Worksheets("Summary").Cells(Rows.Count, 4).End(xlUp).Offset(2, 0).PasteSpecial (xlPasteValues) End If Next Worksheet Worksheets("Summary").Select End Sub 是您的自定义Runnable类的编号。请注意:我跳过你班级的名字 - 这会产生误解。因此,如果您只使用一个自定义Runnable对象 - 您将始终获得单个x值。