iava多線程詳解(2)-成員變量與局部變量訪問

有兩段代碼dom

1.線程訪問成員變量ide

public class FirstThreadTest
{
    public static void main(String[] args)
    {
        FirstThread r = new FirstThread();

        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);

        t1.start();
        t2.start();

    }
}

/**
* 第一個線程程序
*/
class FirstThread implements Runnable { int i; @Override public void run() { while (true) { System.out.println("number of: " + i++); try { Thread.sleep((long) Math.random() * 1000); } catch (InterruptedException e) { e.printStackTrace(); } if (50 == i) { break; } } } }

代碼中,FirstThread類實現了Runnable接口,其中run()方法的主要工做是輸出"number: "字符串加數字i,而且同時遞增i,當i到達50時,退出循環。spa

main()方法中生成了一個FirstThread類的對象r,而且利用這個一個對象生成了兩個線程。線程

程序的執行結果是:順次打印了0到49的數字,共50個數字。code

這是由於,i是成員變量,則FirstThread的對象r只包含這一個i,兩個Thread對象由於由r構造,因此共享了同一個i對象

當咱們改變代碼以下時(原先的成員變量i被註釋掉,增長了方法中的局部變量i):blog

2.線程訪問局部變量接口

public class FirstThreadTest
{
 public static void main(String[] args)
    {
        HelloThread r = new HelloThread();

        Thread t1 = new Thread(r);
        Thread t2 = new Thread(r);

        t1.start();
        t2.start();

    }

}


 /**
 * 經過Runnable接口實現線程
 */字符串

class FirstThread implements Runnableio

{
    // int i;
    // 若i是成員變量,則FirstThread共享了同一個i
    // 打印結果是0到49的數字
    @Override
    public void run()
    {
        int i = 0;
        // 每個線程都會擁有本身的一份局部變量的拷貝
        // 線程之間互不影響
        // 因此會打印100個數字,0到49每一個數字都是兩遍
        while (true)
        {
            System.out.println("Hello number: " + i++);

            try
            {
                Thread.sleep((long) Math.random() * 1000);
            }
            catch (InterruptedException e)
            {
                e.printStackTrace();
            }

            if (50 == i)
            {
                break;
            }
        }

    }
 }

結論:

若是一個變量是成員變量,那麼多個線程對同一個對象的成員變量進行操做時,它們對該成員變量是彼此影響的,也就是說一個線程對成員變量的改變會影響到另外一個線程。

若是一個變量是局部變量,那麼每一個線程都會有一個該局部變量的拷貝(即使是同一個對象中的方法的局部變量,也會對每個線程有一個拷貝),一個線程對該局部變量的改變不會影響到其餘線程。

相關文章
相關標籤/搜索