Java 函数的执行顺序(多线程)
我正在使用Java 我有一个main函数和函数f()。线程是在f()中创建的,但它比f()中的其他操作花费更多的时间。资本字母的真实顺序是什么Java 函数的执行顺序(多线程),java,multithreading,Java,Multithreading,我正在使用Java 我有一个main函数和函数f()。线程是在f()中创建的,但它比f()中的其他操作花费更多的时间。资本字母的真实顺序是什么 main() { operations A; f(); operations B; } f() { C; final Thread thread = new Thread() { @Override public void run() { many operations, more
main() {
operations A;
f();
operations B;
}
f() {
C;
final Thread thread = new Thread() {
@Override
public void run() {
many operations, more than B+D;
E;
}
};
thread.start();
D;
}
如何确保订单是A-C-D-B-E?您使用条件变量来确保某些代码在收到通知之前不会运行。假设整个过程只运行一次
volatile boolean canGoOn = false;
final Object condition = new Object();
// in main:
B;
synchronized (condition) {
canGoOn = true;
condition.notify();
}
// in thread:
synchronized (condition) {
while (!canGoOn) {
condition.wait();
}
}
E;
(未测试,您可能需要捕获一些中断异常。)
顺便说一句,如果你使用的是Android,整个习惯用法都被打包到类中,你只需要在main中
.open()
它,在thread中.block()
它。你需要使用synchronized(condition)
aroundwait
/notify
调用。@Tudor:谢谢添加。另外,使同步对象成为final
,并可能将canGoOn
声明为volatile
,这是一种很好的做法,但这些都是挑剔的地方。@Tudor因为您只访问同步块内的条件变量,所以不必使其变为volatile。@Voo:同意。我喜欢保持的易变性
,提醒自己这是一个在多个线程之间使用的变量。。