Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 复杂线程控制_Java_Multithreading - Fatal编程技术网

Java 复杂线程控制

Java 复杂线程控制,java,multithreading,Java,Multithreading,假设我有3个执行线程,下面描述每个线程将执行的操作 线程1-主线程 线程2-检测器线程 线程3-动作线程 当线程1启动时,它生成线程2。线程2将简单地与线程1一起运行并搜索事件。当事件发生时,我希望线程2生成一个新线程,线程3。我希望线程3与线程1连接。这可能吗 示例代码: public class ThreadA { // variable to flag if ThreadB should still loop private static boolean runThreadB = tr

假设我有3个执行线程,下面描述每个线程将执行的操作

线程1-主线程 线程2-检测器线程 线程3-动作线程

当线程1启动时,它生成线程2。线程2将简单地与线程1一起运行并搜索事件。当事件发生时,我希望线程2生成一个新线程,线程3。我希望线程3与线程1连接。这可能吗

示例代码:

 public class ThreadA {

// variable to flag if ThreadB should still loop
private static boolean runThreadB = true;

public void mainMethod() {

    new ThreadB().start();

    // do some stuff

    // make sure thread B can end
    runThreadB = false;

}

// inner class / Thread B
class ThreadB extends Thread {

    @Override
    public void run() {

        // loop until Thread A is done
        while (runThreadB) {

            // wait for event, if event is found, spawn thread C
            ThreadC threadC = new ThreadC();
            threadC.start();

            /**
             * Need thread C to somehow join ThreadA
             */
            try {
                threadC.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }

}
}


}必须同步线程。您可以使用
ReentrantLock
来执行此操作

下面是一个简单的问题示例(事件生产者-消费者):

线程将使用此类中的对象

Thread eventProducer = ...
Thread eventConsumer = ...
eventProducer.start();
eventConsumer.start();

您的线程现在已同步。

是的,这是可能的。但很多事情都是可能的,包括胡说八道的东西,以及没有任何效用的东西。如果你问一个更具体的问题,比如“这是一个好主意吗?”或者这是我的代码,为什么它不起作用?你说的“与线程1连接”是什么意思?如果线程1将生成两个线程,然后等待其中一个或两个线程完成,这不是更简单吗?谁将生成线程2应该捕获的事件?线程3应该做什么?为什么我得到了一个负面标记?你能看看我上面的编辑吗?请帮助说明如何使用重入锁进行此操作?
public class Foo{
    //...

    public void consumeEvent() throws InterruptedException{
        aLock.lock();
        try {
            while(noEvent){
                eventAvailable.await();
            }
            // use the event
        } finally {
            sLock.unlock();
        }
    }

    public void createEvent() throws InterruptedException{
        aLock.lock();
        try {
            // add an event
            eventAvailable.signalAll();
        } finally {
            sLock.unlock();
        }
    }

    private Lock aLock = new ReentrantLock();
    private Condition eventAvailable = aLock.newCondition();
}
Thread eventProducer = ...
Thread eventConsumer = ...
eventProducer.start();
eventConsumer.start();