簡體   English   中英

如何使兩個線程同時工作

[英]How to make two threads work in same time

我有兩個線程:一個用於填充數組,第二個用於打印。 似乎兩個線程不能同時工作。

當我運行代碼時,其打印第一個線程工作,然后其打印數組和第二個線程工作,我如何知道它們是否在同一時間工作?

這是我的代碼:

public class Main {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        firstthread f=new firstthread();            
        secondthread s=new secondthread();

        s.start();
        f.start();         
    }

}

並且該類同時包含fill和print方法:

public class Array {
private static int [] ar=new int[500];

 public static void fillarray()
 {
     for (int i = 0; i < ar.length; i++)         
            ar[i]=i;
 }

 public static void printarray()
 {
     for (int i = 0; i < ar.length; i++)         
          System.out.print(ar[i]+" ");  
 }
 }

第一個線程類:

    public class firstthread extends Thread{

            public void  run() {

                   Array.fillarray();
                System.out.print("first thread working ");

            }

    }

第二個線程類:

    public class secondthread extends Thread{


        public void run() {

            Array.printarray();

            System.out.println("second array working");
        }

    }

fillarray和printarray方法運行速度太快,因此您不會獲得線程。

將Thread.sleep(10)添加到每個循環。 這樣,代碼將運行得慢得多,並且線程將相互穿插。 他們可能會采用這種方法。

然后進入隨機睡眠#秒,您將看到不同的行為。

啟動線程需要花費一些時間到JVM。 第一個線程比另一個線程啟動執行它的run()方法更快。 這就是為什么您看到這種行為。

您想要實現生產者-消費者問題的解決方案...坦白地說,如果不鎖定對象的監視器,則您無權控制任何事情。 您無法控制線程執行的時間(提供給它的Timeslice)。 如果時間片過長,您會感到一個線程接一個線程執行,因為您的處理器太快了,您的第一個線程將有足夠的時間來完成其工作。 如果您想知道線程如何正常工作,請使用wait()和notify()以及同步方法將其更改為生產者-消費者問題。

  1. 珍妮也是對的,您可以放下sleep(),它有90%的可能會起作用。
  2. 您可以增加要填充/打印的元素的數量。
  3. 如果您不使用同步/等待/通知,那么您閱讀的內容有70%的機會要超過您寫的內容(填寫在數組中)。

問題尚不清楚。 您是說如何分辨它們是否在同一陣列上工作? 如果是這樣,答案是肯定的。 該數組是靜態的,這意味着只有一個屬於類數組。 因此,不會有多個實例被不同的線程處理。

如上所述,線程運行非常快。 因此,即使他們正在訪問同一對象,一個線程也將在第二個線程開始之前完成其工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM