2012-10-06 107 views
-2

我想並排執行多條線程。例如:
ex:會有一個簡單的計數器方法,線程將訪問該方法並打印計數器值。一個線程在開始之前不應該等待另一個線程停止。並行執行多條線程

樣品輸出[也許]:

T1 1
T2 1
T1 2
T1 3
T1 4
T2 2
T1 5

我沒有事先關於多線程的想法,只是想學習。

+2

您已經發布了一個「我想要」,但毫無疑問呢。當然你已經閱讀過關於線程的教程,對吧?你堅持什麼具體步驟? –

+0

並排啓動線程。對於計數器1-500,較高優先級的線程應該比較慢的優先級線程完成更快。 – Sourav

+0

學習的最好方法就是開始做。簡單的多線程代碼有數百萬個例子,所以我會從其中的一些開始。 –

回答

1

如果在計數器共享你想要的東西是這樣的:

class ThreadTask implements Runnable { 
    private static AtomicInteger counter = new AtomicInteger(); 
    private int id; 

    public ThreadTask(int id) { this.id = id; } 

    public void run() { 
     int local = 0; 
     while((local = counter.incrementAndGet()) < 500) { 
      System.out.println("T" + id + " " + local); 
     } 
    } 
} 

... 

new Thread(new ThreadTask(0)).start(); 
new Thread(new ThreadTask(1)).start(); 

否則,如果你想有一個每線程計數器:

class ThreadTask implements Runnable { 
    private int counter = 0; 
    private int id; 

    public ThreadTask(int id) { this.id = id; } 

    public void run() { 
     while(counter < 500) { 
      counter++; 
      System.out.println("T" + id + " " + counter); 
     } 
    } 
} 

... 

new Thread(new ThreadTask(0)).start(); 
new Thread(new ThreadTask(1)).start(); 
0

不具有實際的問題....

我想你可以啓動多個線程,並讓他們訪問synchonised printCounter方法。

喜歡的東西

public class MyRunnable implemetns Runnable { 
    private SharedObject o 
    public MyRunnable(SharedObject o) { 
     this.o = o; 
    } 
    public void run() { 
     o.printCounter(); 
    } 
} 

然後開始你可以做

new Thread(new MyRunnable()).start(); 
new Thread(new MyRunnable()).start(); 

然後在您的共享對象方法,你想有保存,您可以打印一個變量法。這種方法也可以增加計數器。

雖然線程調度程序不保證線程何時運行,但請注意。

1

你還沒有真正問過任何特定的東西。如果你只是尋找一個非線程安全的計數器的一般例子是跨越兩個或多個線程共享的,在這裏你去:

public class Counter extends Thread { 
    private static int count = 0; 

    private static int increment() { 
     return ++count; //increment the counter and return the new value 
    } 

    @Override 
    public void run() { 
     for (int times = 0; times < 1000; times++) { //perform 1000 increments, then stop 
      System.out.println(increment()); //print the counter value 
     } 
    } 

    public static void main(String[] args) throws Exception { 
     new Counter().start(); //start the first thread 
     new Counter().start(); //start the second thread 
     Thread.sleep(10000);  //sleep for a bit 
    } 
} 
+1

實際上不需要睡覺,因爲它們不是守護線程。 – Tudor

+0

@Tudor - 是的,但某些IDE可能會在程序終止時清除/隱藏控制檯輸出。這就是'sleep()'在那裏的主要原因。 – aroth

+0

在所有線程完成之前程序不會終止。 –