-2

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

样本输出[也许]:

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

我对多线程一无所知,只是想学习。

4

3 回答 3

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
    }
}
于 2012-10-06T13:46:31.593 回答
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();
于 2012-10-06T13:47:30.063 回答
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();

ETC

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

请注意,尽管线程调度程序不保证线程何时运行。

于 2012-10-06T13:44:49.893 回答