`

子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。

阅读更多

/**
 * 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。
 * @author lijinnan
 * @date:2013-11-5 下午3:07:10  
 */
public class ThreadComunication {

    private static final int ROUND_COUNT = 50;
    
    public static void main(String[] args) {
        
        //主线程和子线程“共享”一个Busines实例
        final Business business = new Business();
        
        /*
        //主线程
        for (int i = 0; i < ROUND_COUNT; i++) {
            business.main(i);
        }
        */
        
        //子线程-注意要先启动子线程,否则子线程不会启动,主线程在roundIndex=0执行完毕后就陷入无限等待
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                for (int i = 0; i < ROUND_COUNT; i++) {
                    business.sub(i);
                }
            }
            
        }).start();
        
        //主线程
        for (int i = 0; i < ROUND_COUNT; i++) {
            business.main(i);
        }
    }

}


class Business {
    
    private static final int SUB_COUNT = 10;
    private static final int MAIN_COUNT = 100;
    
    private boolean doSub;
    
    public synchronized void sub(int roundIndex) {
        while (!doSub) {
            try {
                wait();
            } catch (InterruptedException e) {
                //ignore
            }
        } 
        for (int i = 0; i < SUB_COUNT; i++) {
            System.out.println("sub " + i + " of " + roundIndex);
        }
        doSub = false;
        notifyAll();
    }
    
    public synchronized void main(int roundIndex) {
        while (doSub) {
            try {
                wait();
            } catch (InterruptedException e) {
                //ignore
            }
        } 
        for (int i = 0; i < MAIN_COUNT; i++) {
            System.out.println("main " + i + " of " + roundIndex);
        }
        doSub = true;
        notifyAll();
    }
    
}
分享到:
评论

相关推荐

    如何从子线程更新主线程数据

    - **消息队列(Message Queue)**:子线程可以通过PostMessage或SendMessage函数向主线程的消息队列发送消息,主线程的窗口消息循环会处理这些消息。 - **共享内存(Shared Memory)**:创建一段共享内存,子线程...

    子线程更新主线程数据

    在多线程编程中,"子线程更新主线程数据"是一个常见的需求,尤其是在UI界面交互和后台处理相结合的应用中。主线程通常负责用户界面的显示与交互,而子线程则用于执行耗时的任务,避免阻塞主线程,提供良好的用户体验...

    Windows下直接启动世界上最小的Linux

    这是微软引入的一个功能,允许用户在Windows 10及更高版本中直接运行原生的Linux二进制文件,无需虚拟化。用户可以直接在Windows命令提示符或PowerShell中运行Linux命令,实现与Linux环境的无缝交互。 在实践过程中...

    C#子线程执行完后通知主线程的方法

    Console.WriteLine("子线程循环操作第 {0} 次", i); Thread.Sleep(500); } callback("我是子线程,我执行完毕了,通知主线程"); } private static void CallBack(string str) { Console.WriteLine(str); }...

    子线程接收主线程发送的消息

    6. **处理消息**:子线程的Handler会在其Looper的消息循环中接收到主线程发送的消息,然后通过`handleMessage()`方法处理这个消息。 在压缩包文件"Looper2"中,可能包含了一个示例代码或者相关的资源,用于演示如何...

    qt 多线程 防止主线程做循环操作导致界面假死

    在使用Qt进行应用程序开发时,有时我们可能会遇到主线程因为执行耗时的循环操作而使得用户界面(UI)无响应,这种现象通常被称为“界面假死”或“UI冻结”。为了解决这个问题,我们可以利用Qt提供的多线程机制,将耗时...

    QT多线程编程、主线程与子线程交互数据

    主线程被称为“GUI线程”,因为它维护着图形用户界面的事件循环。 QT提供了QThread类来实现线程。创建一个QThread对象并重写其run()方法,即可自定义线程的执行逻辑。例如: ```cpp class MyThread : public ...

    android主线程、子线程及线程间通信方式测试app

    本文将深入探讨Android主线程(也称为UI线程)、子线程以及它们之间的通信方式,结合"android主线程、子线程及线程间通信方式测试app"的描述,我们将详细分析相关知识点。 1. **Android主线程**:主线程是应用程序...

    android 主线程给子线程发送消息

    在Android应用开发中,主线程(也称为UI线程)主要负责处理用户界面的更新和交互,而子线程则通常用于执行耗时的操作,如网络请求、数据库操作等,以避免阻塞主线程,保证用户界面的流畅性。本示例"android 主线程给...

    子线程和主线程通过handler 双向通信

    主线程默认拥有一个Looper对象,它是一个消息循环,负责不断检查Message Queue(消息队列)并分发消息。当我们在主线程中创建一个Handler时,这个Handler会关联到主线程的Looper。我们可以通过Handler的post()或...

    子线程控制ProgressDialog的可见性

    由于Android的UI操作必须在主线程中进行,因此在子线程中直接修改ProgressDialog的状态会导致应用崩溃或出现未定义的行为。 要解决这个问题,我们可以使用Handler和Looper。Handler是Android中的消息传递机制,它与...

    多线程显示进度条,子线程耗时10s,主线程在这10s中不停的刷新、显示,进度条界面

    2. **事件驱动编程**:在GUI应用中,主线程通常是一个事件循环,监听用户的输入和系统的事件。当子线程的进度更新时,可以触发一个事件,由主线程处理并更新进度条。例如,使用`Qt`框架中的`QThread`和`signals/...

    Android主线程和子线程区别详解

    3. 示例中的getLabel方法在一个循环中调用了this.Invoke,每次循环都会更新UI,演示了如何在子线程中安全地与主线程交互。 4. 示例还展示了如何暂停子线程(thread.Suspend),但请注意,这种方法并不推荐,因为它...

    android 子线程URL加载网络图片

    - Looper是消息循环器,用于处理MessageQueue中的消息,通常主线程默认有Looper,子线程需要手动添加。 3. **AsyncTask**: - AsyncTask是一个轻量级的异步任务类,适合短时间、小量数据的异步操作。它包含三个...

    Java多线程--让主线程等待所有子线程执行完毕

    - **主线程等待机制**:为了使主线程能够等待所有子线程的完成,可以在主线程中使用一个循环检查`runningThreads`列表,直到该列表为空,表明所有子线程都已完成。 **4. 高级同步机制:CountDownLatch** 另一种更...

    C#利用子线程刷新主线程分享教程

    总之,本教程展示了如何利用C#的多线程特性,实现主线程和子线程间的协作,以实现实时更新界面的需求。在设计多线程应用程序时,要注意线程安全,避免竞态条件和死锁等问题,同时确保界面的用户体验不受到影响。通过...

    在MFC 子线程中使用UI(控件)退出时死锁或者超时处理参考

    在MFC(Microsoft Foundation Classes)框架中,子线程与主线程交互并操作用户界面(UI)时,可能会遇到一些特定的问题,特别是当涉及到退出、死锁或超时的情况。以下是对这些知识点的详细说明: 1. **MFC 子线程**...

    qt编程_在子线程中更新UI界面

    主线程拥有GUI事件循环,子线程可以有自己的事件循环,但通常不处理GUI事件。 3. **QThread的使用**:要创建一个子线程,首先需要继承QThread并重写run()方法,这里放入耗时操作。然后实例化并启动线程。但是,直接...

    子线程中更新UI线程的三种方法

    然后,在子线程中通过Handler的sendMessage()或post()方法发送消息,消息会被添加到主线程的MessageQueue中,由Looper循环取出并交给Handler处理。这样,UI更新操作就在主线程中执行了。 2. Runnable+runOnUiThread...

Global site tag (gtag.js) - Google Analytics