Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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,我正在使用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

我正在使用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 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)
around
wait
/
notify
调用。@Tudor:谢谢添加。另外,使同步对象
成为final
,并可能将
canGoOn
声明为
volatile
,这是一种很好的做法,但这些都是挑剔的地方。@Tudor因为您只访问同步块内的条件变量,所以不必使其变为volatile。@Voo:同意。我喜欢保持
的易变性
,提醒自己这是一个在多个线程之间使用的变量。。