如何让线程在当前线程执行某些语句后等待一段时间

时间:2015-06-07 19:36:09

标签: java multithreading wait

我是MultiThreading的新手,我正在编写一个应用程序,因为我有两个线程T1和T2。 在T1中我有15个要打印的语句,而T2我有15个要打印的语句。 我想在T1执行语句5之后等待T2一段时间,并在T1执行语句10之后继续T2。 我已经编写了代码,但T2没有等待,任何人都可以解释一下。

线程一:T1

public class ThreadOne extends Thread {

public void run() {



    for (int i = 1; i <= 15; i++) {

        System.out.println("This is Thread One " + i);

        if (i == 5) {
            synchronized (Test.threadB) {
                try {
                    Test.threadB.wait();
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }
            }
        } else if (i == 10) {
            synchronized (Test.threadB) {
                Test.threadB.notify();
            }
        }


    }


}
}  

线程二:T2

public class ThreadTwo extends Thread {

public void run() {

    for (int i = 1; i <= 15; i++) {

        System.out.println("This is Thread Two " + i);
    }


}
}  

测试:

public class Test {

static Thread threadA = null;
static Thread threadB = null;

public static void main(String[] args) throws InterruptedException {

    threadA = new ThreadOne();
    threadB = new ThreadTwo();

    threadA.start();
    threadB.start();


}
}

我如何期待O / P:
T1执行Test.threadB.wait();当我是5时,不必打印T2语句。在T1 i为10之后,T2可以开始打印。

但是我得到的是:

This is Thread One 1
This is Thread One 2
This is Thread One 3
This is Thread Two 1
This is Thread Two 2
This is Thread One 4
This is Thread Two 3
This is Thread One 5
This is Thread Two 4
This is Thread Two 5
This is Thread Two 6
This is Thread Two 7
This is Thread Two 8
This is Thread Two 9
This is Thread Two 10
This is Thread Two 11
This is Thread Two 12
This is Thread Two 13
This is Thread Two 14
This is Thread Two 15
This is Thread One 6
This is Thread One 7
This is Thread One 8
This is Thread One 9
This is Thread One 10
This is Thread One 11
This is Thread One 12
This is Thread One 13
This is Thread One 14
This is Thread One 15 

为什么在T1 i == 5或(这是打印的第一个螺纹5)之后才执行T2步骤?请任何人解释一下。

2 个答案:

答案 0 :(得分:3)

我更喜欢使用java.util.concurrent而不是wait/notify的类/接口,因为我相信它使代码更易读/更不容易出现同步错误。在您的情况下,您可以使用ThreadOneThreadTwo之间共享的Semaphore来暂停和恢复ThreadTwo - 在每次迭代时使用一个许可初始化信号量{{1调用ThreadTwo并且如果有可用的许可(返回值> 0)则继续执行,否则调用availablePermits()导致线程阻塞直到许可可用。 acquire()致电ThreadOne暂停drainPermits(),然后致电ThreadTwo以允许release()恢复。

正如Pshemo在评论中所指出的,优良作法是实施Runnable而不是扩展ThreadTwo - 这可以避免使您的类混乱,并允许您使用ExecutorService来汇集线程

Thread

答案 1 :(得分:-3)

将您在ThreadOne中所做的事情复制到第二个。 线程旨在使程序的执行是并行的。

因此,当您没有给出任何等待逻辑时,您不希望第二个线程等待。

你应该使用第二个线程作为第一个线程中的锁定,并将第一个线程作为第二个线程中的锁定使用:

相关问题