2012-05-23 208 views
0

是否可以從線程同時執行相同的功能。我懷疑,在java方法區域是相同的,所以多次調用相同的功能可能會導致等待狀態,我是否正確?Java同時執行相同功能

+0

答案是否定的,除非你使用'synchronized'關鍵字。閱讀[在這裏]教程(http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html)。 –

回答

1

是的,這是可能的,除非你使用同步那裏不會有任何等待鎖定。這是默認行爲,不可以交叉鎖定和線程執行。

雖然請記住,您的線程調度程序將允許一個線程在給定的時間運行。

默認情況下,在沒有同步的情況下併發訪問沒有等待就是行爲。

樣品在於向世人證明

public class MyThread implements Runnable { 

    private MyThreadInvocation threadInvocation = null; 

    public MyThread(MyThreadInvocation threadInvocation) { 
     this.threadInvocation = threadInvocation; 
    } 

    @Override 
    public void run() { 
     System.out.println("Calling from : " + Thread.currentThread().getName()); 
     this.threadInvocation.printMessage(); 
    } 
} 


public class MyThreadInvocation { 
    public void printMessage(){ 
     System.out.println("Hello"); 
    } 

    public static void main(String[] args) { 
     MyThreadInvocation myThreadInvocation = new MyThreadInvocation(); 
     Thread t1 = new Thread(new MyThread(myThreadInvocation)); 
     t1.setName("First Thread"); 

     Thread t2 = new Thread(new MyThread(myThreadInvocation)); 
     t2.setName("Second Thread"); 

     Thread t3 = new Thread(new MyThread(myThreadInvocation)); 
     t3.setName("Third Thread"); 

     t1.start(); 
     t2.start(); 
     t3.start(); 
    } 
} 
2

葉氏。您可以默認執行方法的併發執行。要停止併發執行,您需要使用同步關鍵字或併發類

1

是的,完全可以從多個線程同時調用相同的函數。每個線程都有自己的堆棧,這意味着它獲得了函數中使用的局部變量的副本。

在多核機器上,線程甚至可能在同一個函數中同時運行。

當然,如果從多個線程同時調用相同的函數,如果它們訪問相同的可變狀態(例如,線程讀取和寫入的對象中的字段)可能會導致問題。如果您想防範這些問題,您需要使用某種形式的鎖定或同步。