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

子线程业务:循环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

时间: 2024-10-30 16:08:28

子线程和主线程业务依次执行循环50次的相关文章

安卓,子线程获取网络图片,发消息给主线程,主线程用图片填充listview,出错

问题描述 安卓,子线程获取网络图片,发消息给主线程,主线程用图片填充listview,出错 先上logcat: 我的xml布局就是一个按钮,和一个listview,listview里就一个imageview,按下按钮开始从网络获取图片,然后发消息到主线程,然后listview就填充数据.xml代码就不贴了. 以下是mainactivity public class MainActivity extends AppCompatActivity implements View.OnClickList

c#如何通过子线程控制主线程控件呢?

问题描述 c#如何通过子线程控制主线程控件呢? 我主窗口有个webbrowser控件,想通过子线程点击已显示出来的网页实现填写的功能,要怎么实现呢?我直接写代码会出错: 求大神贴点代码! 我用主线程弄个按钮是可以点击的,就是子线程不行 错误信息: "System.InvalidCastException"类型的未经处理的异常在 System.Windows.Forms.dll 中发生 其他信息: 指定的转换无效. 线程代码 HtmlElement ht = webBrowser1.Do

linux-Android在主线程里用handler循环ping命令固定次数会出现ioexception

问题描述 Android在主线程里用handler循环ping命令固定次数会出现ioexception 我做了一个ping百度的程序,使用的是handler循环.下面是循环体: private Handler handler = new Handler(); private Runnable task = new Runnable() { public void run() { // TODO Auto-generated method stub handler.postDelayed(this

多线程问题,附线程关闭主线程也跟着关闭~~

问题描述 staticclassProgram{///<summary>///应用程序的主入口点.///</summary>[STAThread]staticvoidMain(){//这里新启一个线程Threadthread=newThread(newParameterizedThreadStart(mainThreadStart));thread.IsBackground=true;thread.Start();//这里为主线程,运行窗体Application.EnableVis

Android中主线程与子线程之间相互通信教程

有时候,我们也可能碰到这样子的一种需求:需要主线程来向子线程发送消息,希望子线程来完成什么任务.如果这样子应该怎么做呢?这就是这篇文章将要讨论的内容. 一.HandlerThread类 主线程发送消息给子线程,通常思维逻辑就是:其实很简单,在主线程中实例化一个Handler,然后让他与子线程相关联(只要它与子线程的Looper相关联即可),这样子它处理的消息就是该子线程中的消息队列,而处理的逻辑都是在该子线程中执行的,不会占用主线程的时间.那么我们就来实现一下,看看这样子到底行得通还是行不通.新

java编程中主线程子线程交替问题分析

问题:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次. 分析:这个实际上是很简单的问题,即子线程run,主线程阻塞--->子线程阻塞,主线程run,能够使线程阻塞的方法有很多,最常见的是sleep与wait:当然,需要控制的话,用wait/notify.子线程与主线程共同操作一个Resource 对象,而Resource对象中由两个方法分别实现子线程与主线程的操作对象 代码如下: package treadga

Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息

MainActivity如下: package cc.c; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.widget.TextView; /** * Demo描述: * * 示例步骤如下: * 1 子线程给子线程本身发送消息 * 2 收到1的消

多线程执行完主线程不退出

问题描述 用BlockingQueue 做了一个多线程的程序, 每个线程都已经执行完run方法(通过print显示已经执行完run), 并且在主线程里做了一个for循环来判断几个线程的状态, 得到他们都已经是TERMINATED状态,但是主线程就是不能自己结束. 其中一个线程(生产者)用了spring来得到数据库资源. 有多线程经验的兄弟帮帮我,十分感谢. 不知道问题是否描述清楚 问题补充:limengchengg 写道 解决方案 BlockingQueue 读取数据有四种方法吧其中有一种是阻塞

多线程同步-主线程等待所有子线程完成案例

http://blog.csdn.net/qiujuer/article/details/34862469 有时候我们会遇到这样的问题:做一个大的事情可以被分解为做一系列相似的小的事情,而小的事情无非就是参数上有可能不相同而已! 此时,如果不使用线程,我们势必会浪费非常多的时间来完成整个大的事情,而使用线程的话将会存在这样的问题: 主线程启动所有子线程并发执行后主线程就直接返回了,导致外部函数判读整个大的事情完成了,但是实际上并没有完成! 针对以上情况我想我会采用多线程方式执行同时解决主线程等待