子线程和主线程业务依次执行循环50次

简介: 子线程业务:循环10次主线程业务:循环20次这两个循环(业务)需要交替执行共50次要用到共同数据的(包括同步锁)或共同算法(加密解密)的若干个方法应该归在同一个类上,这种设计正好体现了高内聚和程序的健壮性 while (bShouldSub) {                try {                    this.wait();           


子线程业务:循环10次

主线程业务:循环20次


这两个循环(业务)需要交替执行共50次


要用到共同数据的(包括同步锁)或共同算法(加密解密)的若干个方法应该归在同一个类上,这种设计正好体现了高内聚和程序的健壮性


 while (bShouldSub) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

中使用while防止假唤醒,使用if就不行

虚假唤醒就是一些obj.wait()会在除了obj.notify()和obj.notifyAll()的其他情况被唤醒,而此时是不应该返回的,所以要加条件判断。

synchronized (obj) {  
         while (<condition does not hold>)  
             obj.wait();  
         ... // Perform action appropriate to condition  
     }


public class TraditionalThreadCommunication {
    final Business business = new Business();

    public static void main(String[] args) {

            new TraditionalThreadCommunication().init();
        
    }

    private void init()  {

        new Thread(new Runnable() {

            @Override
            public void run() {

                for (int i = 0; i <= 50; i++) {

                    business.sub(i);

                }
            }
        }).start();

        for (int i = 0; i <= 50; i++) {

            business.main(i);
        }

    }

    //业务对象
    class Business {
        private boolean bShouldSub = true;

        public synchronized void sub(int i) {
            while (!bShouldSub) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            for (int j = 1; j <= 10; j++) {

                System.out.println("sub thread sequence of" + j + ",loop of "
                        + i);
            }
            bShouldSub = false;
            this.notify();
        }

        public synchronized void main(int i) {

            while (bShouldSub) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }

            for (int j = 1; j <= 20; j++) {

                System.out.println("main thread sequence of" + j + ",loop of "
                        + i);
            }

            bShouldSub = true;
            this.notify();
        }

    }

}


使用lock和condition改写代码

http://tianxingzhe.blog.51cto.com/3390077/1716805


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1716473

目录
相关文章
|
7月前
|
监控 测试技术 程序员
解决线程死循环问题的有效方法
作为开发者想必都清楚,多线程应用程序的开发为我们日常开发工作中提供了并发执行任务的能力,但线程死循环问题却是一个常见而令人头疼的挑战,因为线程死循环可能导致系统的不稳定性、资源浪费以及应用程序的异常运行,所以准确地定位和妥善处理线程死循环现象,并在编码阶段就避免潜在风险,成为开发人员必须面对的重要问题,线程死循环问题的解决不仅有助于提高系统的稳定性和可用性,还能优化资源利用和提升应用程序的性能,通过采取适当的预防和处理措施,开发人员能够避免线程陷入无尽的循环,并及时发现和解决潜在问题。那么本文就来分享一下关于如何处理线程死循环问题,以及如何在编码阶段规避潜在风险。
233 2
解决线程死循环问题的有效方法
|
7月前
|
Java
主线程等待子线程执行完毕再执行的几种方式
主线程等待子线程执行完毕再执行的几种方式
146 0
|
7月前
关于子线程被打断执行的问题
关于子线程被打断执行的问题
主线程等待子线程执行完毕再执行方法
主线程等待子线程执行完毕再执行方法
191 0
|
消息中间件 前端开发 NoSQL
如何判断线程池任务执行完?
如何判断线程池任务执行完?
244 0
如何判断线程池任务执行完?
|
Java
Java并发计算判断线程池中的线程是否全部执行完毕
Java并发计算判断线程池中的线程是否全部执行完毕
100 0
三个线程循环顺序打印
三个线程循环顺序打印
82 0
|
编译器
主线程退出对子线程影响
主线程退出对子线程影响
136 0
|
Java
如何让线程池里面的线程按照顺序执行?
笔者今天看到一个有趣的面试题,如何让多个线程按照既定的顺序依次执行?比如每个线程输出一个整数,
690 0
两个线程按顺序打印1~100的几种实现
两个线程按顺序打印1~100的几种实现
181 0