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!
# 1 楼答案
你可能想要的是某种信号量和麦加主义的信号
看一下文档here
# 2 楼答案
如果是像您这样的简单案例(只有两个线程),那么我认为您可以使用简单的布尔值(Java中的原子布尔值)
1)将布尔值(我们称之为decider)设置为false
2)启动两个线程
3)螺纹1将具有:
另一个:
while(true)(或其他条件)似乎有点开销,因此您可以在两个if语句中添加一个锁(lock#lock()将等待锁释放)
如果你想把它推广到更多的线程,你只需要用一些可以接受更多状态的东西来代替布尔值。每个线程可能有一个ID(从0到N),并且仅当invocationNr modulo nrOfThreads==ID时才会输入if
# 3 楼答案