并排执行多个线程

时间:2012-10-06 13:38:39

标签: java multithreading

我想并排执行多个线程 例:将有一个简单的计数器方法,线程将访问该方法并将打印计数器值。一个线程不应该等待另一个线程在启动之前停止。

示例输出[可能]:

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

我对多线程没有先前的想法,只是想学习。

3 个答案:

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

答案 2 :(得分:0)

没有实际问题......

我认为您可以启动多个线程并让它们访问同步的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();

然后在您的sharedObject方法中,您希望拥有一个包含可以打印的变量的方法。这种方法也可以增加计数器。

虽然线程调度程序不保证何时运行线程,但要注意。