5

我有这个类,我在其中运行了一个 for 循环 10 次。此类实现 Runnable 接口。现在在 main() 我创建了 2 个线程。现在两者都将循环运行到 10 点。但我想检查每个线程的循环计数。如果 t1 超过 7 则让它休眠 1 秒以让 t2 完成。但是如何实现呢?请看代码。我尝试过,但看起来完全愚蠢。只是如何检查线程的数据???

class SimpleJob implements Runnable {
    int i;
    public void run(){
        for(i=0; i<10; i++){
            System.out.println(Thread.currentThread().getName()+" Running ");
        }        
    }

    public int getCount(){
        return i;
    }
}
public class Threadings {
    public static void main(String [] args){
        SimpleJob sj = new SimpleJob();
        Thread t1 = new Thread(sj);
        Thread t2 = new Thread(sj);

        t1.setName("T1");
        t2.setName("T2");

        t1.start();
        try{
            if(sj.getCount() > 8){ // I know this looks totally ridiculous, but then how to check variable i being incremented by each thread??
                System.out.println("Here");
                Thread.sleep(2000);
            }            
        }catch(Exception e){
            System.out.println(e);
        }
        t2.start();
    }    
}

请帮忙

4

3 回答 3

7

您应该使用一些同步对象,而不是依赖于减慢线程。我强烈建议您查看 java.util.concurrent 包中的一个类。你可以使用这个 CountdownLatch - 线程 1 将等待它,线程 2 将执行倒计时并释放锁,并让线程 1 继续(释放应该在线程 2 代码的末尾完成)。

于 2012-06-18T19:11:27.797 回答
0

如果目标是并行运行 2 个 Runnables(作为线程)并等待它们都完成,您可以按照复杂性/功能的递增顺序:

  1. 使用 Thread.join (如@Suraj Chandran 所建议,但他的回复似乎已被删除)
  2. 使用 CountDownLatch(也由 @zaske 建议)
  3. 使用 ExecutorService.invokeAll()

编辑添加

首先,我不明白“如果你在 7 岁,那么等待另一个”的逻辑是什么。但是,要从您的主代码中使用 Thread.join(),代码看起来像

t1.start();  // Thread 1 starts running...
t2.start();  // Thread 2 starts running...

t1.join();   // wait for Thread 1 to finish
t2.join();   // wait for Thread 2 to finish

// from this point on Thread 1 and Thread 2 are completed...
于 2012-06-18T19:13:11.647 回答
0

我添加了一个同步块,一次可以由一个线程进入。两个线程并行调用并进入方法。一个线程将赢得比赛并获得锁定。第一个线程离开块后等待 2 秒。在这个时候,第二个线程可以迭代循环。我认为这种行为是需要的。如果第二个线程也不能等待 2 秒,您可以设置一些布尔标志,即第一个线程完成了块并在 if 语句中使用此标志,这样可以防止第二个线程的等待时间。

class SimpleJob implements Runnable {
int i;
public void run(){

    synchronized (this) {
        for(i=0; i<8; i++){
            System.out.println(Thread.currentThread().getName()+" Running ");
        } 
    } 

    try {
        System.out.println("Here");
        Thread.sleep(2000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    for(i=0; i<2; i++){
        System.out.println(Thread.currentThread().getName()+" Running ");
    }
}

public int getCount(){
    return i;
}
}

public class Threadings {
public static void main(String [] args){
    SimpleJob sj = new SimpleJob();
    Thread t1 = new Thread(sj);
    Thread t2 = new Thread(sj);

    t1.setName("T1");
    t2.setName("T2");

    t1.start();
    t2.start();
}    
}
于 2012-06-18T19:24:19.233 回答