Java 如何同步顺序执行多个线程 请问java中多线程的执行顺序是怎样的?

java\u591a\u7ebf\u7a0b\u95ee\u9898\uff1a\u591a\u4e2a\u7ebf\u7a0b\u8bbf\u95ee\u540c\u4e00\u8d44\u6e90\u65f6\u5982\u4f55\u4fdd\u8bc1\u7ebf\u7a0b\u4e4b\u95f4\u8bbf\u95ee\u7684\u987a\u5e8f\u6027\u3002

\u6572\u9f13\u7684\u65b9\u6cd5\u4e0a\u52a0synchronize,\u4fdd\u8bc1\u540c\u65f6\u53ea\u6709\u4e00\u4e2a\u4eba\u6572\u9f13,

\u5404\u7ebf\u7a0b\u90fd\u9700\u8981\u4e00\u4e2a\u9002\u5408\u6761\u4ef6,\u4f8b\u5982\u5b9a\u4e49\u4e00\u4e2aflag,
\u7ebf\u7a0b1, for (true){if(flag==a) \u6572\u9f13 else sleep(xxx);}
\u7ebf\u7a0b1, for (true){if(flag==b) \u6572\u9f13 else sleep(xxx);}

thread\u7c7b\u662f\u88ab\u7ee7\u627f\u7684\uff0c\u6267\u884c\u7684\u65f6\u5019\u8c03\u7528\u7684\u662f\u7ee7\u627f\u5b83\u7684\u5b50\u7c7b\uff0c\u4f46java\u4e00\u822c\u5b9e\u73b0\u591a\u7ebf\u7a0b\u4e0d\u662f\u7ee7\u627fthread\u7c7b\uff0c\u800c\u662f\u5b9e\u73b0runnable\u63a5\u53e3\uff0c\u56e0\u4e3ajava\u4e0d\u80fd\u591a\u91cd\u7ee7\u627f\uff0c\u6240\u4ee5\u7ee7\u627fthread\u7c7b\u540e\u5c31\u4e0d\u80fd\u7ee7\u627f\u522b\u7684\u7c7b\u4e86\u3002
\u53ea\u8981\u5b9e\u73b0runnable\u63a5\u53e3\uff08\u6216\u7ee7\u627f\u4e86thread\u7c7b\uff09\u5c31\u53ef\u4ee5\u5b9e\u73b0\u591a\u7ebf\u7a0b\u3002

\u6bd4\u5982\u8bf4\u6709a b c d e\u4e94\u4e2a\u7c7b\u90fd\u5b9e\u73b0runnable\u63a5\u53e3\uff08\u6216\u7ee7\u627f\u4e86thread\u7c7b\uff09
\u4f60\u5148\u8fdb\u4e86main\u65b9\u6cd5\uff0c\u5c31\u521b\u5efa\u4e86\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u8fd9\u4e2a\u7ebf\u7a0b\u662fmain\u65b9\u6cd5\u7684
\u4f60\u8c03\u7528a\u7684run\uff08\uff09\u65b9\u6cd5\uff0c\u5c31\u53c8\u521b\u5efa\u4e00\u4e2a\u7ebf\u7a0b\uff0c\u8fd9\u4e2a\u7ebf\u7a0b\u662fa\u65b9\u6cd5\u7684\u3002

\u5982\u679c\u8fd8\u4e0d\u61c2\u5f97\u8bdd\u5efa\u8bae\u4f60\u53bb\u770b\u770b\u4ec0\u4e48\u53eb\u7ee7\u627f\u548c\u63a5\u53e3\uff0c\u57fa\u7840\u5dee\u7684\u8bdd\u7406\u89e3\u8d77\u6765\u6709\u70b9\u56f0\u96be
\u6211\u53ef\u662f\u8f9b\u8f9b\u82e6\u82e6\u6253\u5b57\u534a\u5929\u4e86\uff5e\uff5e\uff5e

这个要分段来实现, 第一步是让线程同步,第二部是让线程有顺序。
同步:我们可以用synchronized来解决。
Java线程同步原理: java会为每个object对象分配一个monitor,当某个对象的同步方法(synchronized methods )被多个线程调用时,该对象的monitor将负责处理这些访问的并发独占要求。
当一个线程调用一个对象的同步方法时,JVM会检查该对象的monitor。如果monitor没有被占用,那么这个线程就得到了monitor的占有权,可以继续执行该对象的同步方法;如果monitor被其他线程所占用,那么该线程将被挂起,直到monitor被释放。
当线程退出同步方法调用时,该线程会释放monitor,这将允许其他等待的线程获得monitor以使对同步方法的调用执行下去。就像下面这样:
public void test() {
synchronized (this) {
//做一些事
//这里只会有一个线程来调用该方法,因为只有一个this对象作为资源分配给该线程
}

}

顺序:我们可以用List来解决,因为它是有序的。我们只需要将要执行的线程放入到List中

上代码:
/**
* 让多个线程同步顺序执行的线程管理器
* @author bianrx
* @date 2012.1.18
* SynchronizedRunMultiThread
*/
public class SyncManager {
/**
* 待执行的线程集合,注意这里必须是Runnable接口类型,下面会解释
*/
private List<Runnable> runnableList;

public SyncManager(){}

public SyncManager(List<Runnable> runnableList) {
this.runnableList = runnableList;
}

public void setRunnable(List<Runnable> runnableList) {
this.runnableList = runnableList;
}
public void run() {
//遍历代执行的线程集合
for(Runnable runnable: runnableList) {
runThread(runnable);
}
}

/**
* 按顺序同步执行多个线程
* @author bianrx
* @date 2012.1.18
* @param runnable
*/
private void runThread(Runnable runnable) {
synchronized (this) {
runnable.run();//这里需要注意的是:必须调用run方法,因为如果你调用了start方法,线程只会向JVM请求资源,但是未必就执行其中的run。
//这个方法是同步的,所以当前只有一个线程占用了this对象。
}
}
}

扩展阅读:java for循环执行顺序 ... java测试类test如何执行 ... java执行多行cmd指令 ... java运算符执行顺序 ... java代码的执行顺序 ... java多线程并发执行 ... java如何延迟两秒执行 ... java执行顺序优先级 ... java三个线程abc顺序执行 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网