控制线程的运行顺序+责任链模式

在此之前实现了两个线程的交替运行,那么也该来研究一下如何控制线程的执行顺序。

此笔记只有部分实现。

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();

    }
}

.
.
.

 

posted @ 2022-01-24 16:03  豆浆不要糖  阅读(183)  评论(0)    收藏  举报