繁体   English   中英

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

[英]How to make a thread wait for some time after current thread executes some statements

我是MultiThreading的新手,正在编写一个应用程序,因为我有两个线程T1和T2。 在T1中,我要打印15条语句,而在T2中,我要打印15条语句。 我喜欢在T1执行语句5之后等待T2一段时间,并在T1执行语句10之后继续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可以开始打印。

但是我得到的O / p是:

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 ststements? 请任何人解释。

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

正如Pshemo在评论中所指出的那样,实现Runnable而不是扩展Thread是一个好习惯-这避免了使您的类混乱,并且还允许您使用ExecutorService池化线程。

Runnable runnableOne = // ...
Runnable runnableTwo = // ...
ExecutorService executor = Executors.newFixedThreadPool(2);
executor.submit(runnableOne);
executor.submit(runnableTwo);

只需将您在ThreadOne中所做的复制到第二个即可。 线程旨在使程序的执行平行。

因此,当您没有给第二个线程任何等待逻辑时,您就不会期望它等待第二个线程。

您应该将线程二用作线程一中的锁,并将线程一用作线程二中的锁:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM