有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java严格按照顺序执行两个独立的线程

我想以严格的顺序执行两个独立的线程,即“A->;B->;A->;B”,谁知道如何执行

我不希望序列之间有任何延迟(如睡眠、产量)

以下是一些我编写但无法运行的代码:

    public void onClick_start_thread_a(View v) {
    logger.d("onClick_start_thread_a");
    Runnable r = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                synchronized (flag) {
                    try {
                        flag.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    logger.d("Thread A!");
                }
            }
        }
    };
    Thread t = new Thread(r);
    t.start();
}

public void onClick_start_thread_b(View v) {
    logger.d("onClick_start_thread_b");
    Runnable r = new Runnable() {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            while (true) {
                synchronized (flag) {
                flag.notify();
                logger.d("Thread B!");
                }
            }
        }
    };
    Thread t = new Thread(r);
    t.start();
}

onClick_start_thread_a和onClick_start_thread_b由两个不同的按钮触发,单击按钮后,输出为:

01-11 22:49:40.705: D/THING(25877): {Thread:Thread-619}[MainActivity:] Thread A!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-619}[MainActivity:] Thread A!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-619}[MainActivity:] Thread A!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-619}[MainActivity:] Thread A!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!
01-11 22:49:40.705: D/THING(25877): {Thread:Thread-620}[MainActivity:] Thread B!

共 (3) 个答案

  1. # 1 楼答案

    你可能想要的是某种信号量和麦加主义的信号

    Start Threads A and B
    B - waits on semaphore
    A - does stuff
    A - when finished A signals B
    A - waits on semaphore
    B - does stuff
    B - when finished B signals A
    ...... repeat until done
    

    看一下文档here

  2. # 2 楼答案

    如果是像您这样的简单案例(只有两个线程),那么我认为您可以使用简单的布尔值(Java中的原子布尔值)

    1)将布尔值(我们称之为decider)设置为false

    2)启动两个线程

    3)螺纹1将具有:

    while(true) {
      if(decider.get()) {
        // do stuff
        decider.set(false);
      }
    }
    

    另一个:

    while(true) {
      if(!decider.get()) {
        // do stuff
        decider.set(true);
      }
    }
    

    while(true)(或其他条件)似乎有点开销,因此您可以在两个if语句中添加一个锁(lock#lock()将等待锁释放)

    如果你想把它推广到更多的线程,你只需要用一些可以接受更多状态的东西来代替布尔值。每个线程可能有一个ID(从0到N),并且仅当invocationNr modulo nrOfThreads==ID时才会输入if

  3. # 3 楼答案

        public void onClick_start_thread_a(View v) {
        logger.d("onClick_start_thread_a");
        Runnable r = new Runnable() {
    
            @Override
            public void run() {
                // TODO Auto-generated method stub
                while (true) {
                    synchronized (flag) {
                        System.out.println("Thread A!");
                        flag.notifyAll();
                        try
                        {
                            flag.wait();
                        } catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }
    
    public void onClick_start_thread_b(View v) {
        logger.d("onClick_start_thread_b");
        Runnable r = new Runnable() {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                while (true) {
                    synchronized (flag) {
                        System.out.println("Thread B!");
                        flag.notifyAll();
                        try
                        {
                            flag.wait();
                        } catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            }
        };
        Thread t = new Thread(r);
        t.start();
    }