控制线程的运行顺序+责任链模式
在此之前实现了两个线程的交替运行,那么也该来研究一下如何控制线程的执行顺序。
此笔记只有部分实现。
1,使用join();
简单易操作,此方法有个缺陷就是 调用程序写起来有点冗长,如果有N个线程,那么main();就会非常长,而且有些许重复代码。
/** * @program: * @description: * * 控制线程的执行顺序 * 1,其余方法见线程交替运行笔记 * 2,join(); * 3,使用了责任链设计模式,可以实现N个线程的顺序控制 * 4,线程池 */ public class ThreadOrder_1 { public static void main(String[] args) { Thread f1 = new Thread(new First_1()); Thread s1 = new Thread(new Second_1()); try { f1.start(); f1.join(); s1.start(); s1.join(); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 第一个执行的线程 */ class First_1 implements Runnable { @Override public void run() { System.out.println("First_1 Thread run..."); } } /** * 第二个执行的线程 */ class Second_1 implements Runnable { @Override public void run() { System.out.println("Second_1 Thread run..."); } }
基于以上的缺陷(其实缺陷都是瞎诌的,哈哈哈),可以使用责任链模式,增加一个线程顺序控制类
该方式在调用时控制好执行顺序,最后只要调用一次执行方法即可。【个人觉得有点递的思想...】
以下实现了3个线程的顺序控制。
public class ThreadOrder_1 { public static void main(String[] args) { ThreadOrder order_1 = new ThreadOrder(new First_1()); //设置s1 之后执行的代码 为s1 ThreadOrder order_2 = new ThreadOrder(new Second_1(),new ThreadOrder(new Second_1())); //设置f1 之后执行顺序 order_1.setNextOrder(order_2); // 三个线程执行 first second second order_1.run(); } } .
.
.
/** * 线程顺序控制类 * * 责任链模式 */ class ThreadOrder { private final Runnable first; private ThreadOrder nextOrder; public ThreadOrder(Runnable first, ThreadOrder nextOrder) { this.first = first; this.nextOrder = nextOrder; } public ThreadOrder(Runnable first) { this.first = first; } public void setNextOrder(ThreadOrder nextOrder) { this.nextOrder = nextOrder; } //具体逻辑实现 public void run(){ try { Thread thread = new Thread(first); thread.start(); thread.join(); if(nextOrder != null){ //执行下一个节点的线程 nextOrder.run(); } } catch (InterruptedException e) { e.printStackTrace(); } } }
2,线程池。
控制线程执行顺序,可以使用单线程SingleThreadPool;或者FixedThreadPool(1);
注意关闭线程池,否则程序不结束。
public class ThreadOrder_1 { public static void main(String[] args) { ExecutorService service = Executors.newSingleThreadExecutor(); service.submit(new First_1()); service.submit(new Second_1()); //必须关闭线程池,否则程序不结束 service.shutdown(); } }
.
.
.

浙公网安备 33010602011771号