淘先锋技术网

首页 1 2 3 4 5 6 7

多个线程顺序执行的几种方法?

这个要分段来实现, 第一步是让线程同步,第二部是让线程有顺序。

同步:我们可以用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 顺序执行,多个线程顺序执行的几种方法