多线程 创建子父线程 保证一件事 子线程执行三次后 父线程执行5次 循环10次

package Thread;

/**
 * 创建子父线程 保证一件事 子线程执行三次后 父线程执行5次 循环10次
 * 父线程main线程则为Console台项目的主线程
 * 在main线程中调用了start线程则为子线程
 *
 */
public class FatherAndSonTest {
    public static void main(String[] args) {
        final FatherAndSon  fs = new FatherAndSon();
        new Thread(new Runnable(){
            //JVM 叫本地方法栈
            @Override
            public void run() {
       //子线程的线程体
                for (int i = 0; i < 10; i++)
                    fs.sub();

            }

        }).start();
        //父线程的线程体
        for (int i = 0; i < 10; i++) {
            fs.father();
        }
    }

}
package Thread;

public class FatherAndSon {
    /**
     * 匿名内部类:并不是说接口一定不可用被new
     * 为何这两个方法都必须是同步方法 这两个方法所使用的同步锁都为this?
     * 谁又是this: 谁调用father|son 谁就是this
     * this 子线程--->父--->子--->父
     *     子 父
     *     子 子
     *     父 子
     *     父 父
     */
    boolean flag = true;//开关 为true时 子线程执行 为false时 父线程执行
    // 什么时候回释放锁? wait|方法执行结束
    public synchronized void father(){
        if(flag){
            //理当父线程不执行 wait():如果在一个线程 中调用了obj.wait():
            //自己本身进入阻塞状态并释放对锁的占有(立即释放);
            // notify():唤醒线程(唤醒的是等待obj锁的线程)阻塞队列---->Object 方法
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int i = 0; i < 5; i++) {
            System.out.println("父线程第"+(i+1)+"次执行");
        }
        flag=true;
        this.notify();
    }
    //this FatherAndSon son = new FatherAndSon();对象是单例的
    public synchronized void sub(){
        if(!flag){
            //理当父线程不执行 wait():如果在一个线程 中调用了obj.wait():自己本身进入阻塞状态
            //并释放对锁的占有(立即释放)
            //notify():唤醒线程(唤醒的是等待obj锁的线程)阻塞队列--->Object的方法
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for (int i = 0; i < 3; i++) {
            System.out.println("子线程第"+(i+1)+"次执行");
        }
        flag= false;
        this.notify();
    }
}

原文地址:https://www.cnblogs.com/ls1783047205/p/9751039.html

时间: 2024-07-28 13:20:30

多线程 创建子父线程 保证一件事 子线程执行三次后 父线程执行5次 循环10次的相关文章

JAVA-初步认识-第十二章-多线程创建方式一继承

一. 既然是创建线程,那么线程应该怎么创建?在没有学习java之前,这些程序是谁在操作执行的呢?是由我们所在的操作系统来完成的.Windows里面有个任务管理器,它来管理这些任务,它来创建这些进程,并来创建进程中所用的线程.是由系统来完成的,我们无法直接使用系统来帮我们做这件事情.解决问题的时候,首先想到的是java中是否有给我们提供能解决该问题的对象,尤其是线程还走了系统.你不玩java,它没有多线程,因为windows具备这能力,它在帮你做这个分配呢.我们是做不了的,我们就想说java是否也

C# 跨线程操作控件方法封装

Winform程序需要处理耗时操作时,往往需要将耗时操作放入新开的子线程进行处理,在子线程中可能会经常去修改或操作主线程上的控件: 如果直接在子线程中操作控件,会报线程间操作无效等错误,这里提供一个我自己经常使用的跨线程操作方式,代码如下: //跨线程操作控件 //(将数据全部装填完毕后,在一起放到主界面刷新控件:不要一边装填一边刷新主界面控件,这样依然会导致界面卡顿) public void showMsg(string str) { if (textBox.InvokeRequired) {

C# WinFrom 跨线程访问控件

1.跨线程访问控件委托和类的定义 using System; using System.Windows.Forms; namespace ahwildlife.Utils { /// <summary> /// 跨线程访问控件的委托 /// </summary> public delegate void InvokeDelegate(); /// <summary> /// 跨线程访问控件类 /// </summary> public class Invok

线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading

入门-------------------------------------------------------------------------------- 概述与概念    一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建. 创建和开始使用多线程    public Window1()    {        //主线程         //Code……        //使用匿名方法来启动子线程        Thread t = new Th

C# 多线程修改控件时,提示在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke

一般在多线程调用UI控件时,涉及到跨线程修改UI,需要使用委托,比如如下: this.Invoke((MethodInvoker)delegate { btnRefresh.Enabled = true; }); 但是假如在多线程操作还没完成的时候,我就提前关闭窗体,则会引发InvalidOperationException,提示 “在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke” ,并且如果没有捕获到,则可能导致程序崩溃,直接关闭. 百度之后,发现需要判断控件的

C#中父窗口和子窗口之间实现控件互操作

很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见的有两种方法,基本上大同小异: 第一种,在主窗体类中定义一个静态成员,来保存当前主窗体对象,例如: public static yourMainWindow pCurrentWin = null; 然后在主窗体构造函数中,给静态成员初始化,如下: pCurrentWin = this; 那么在子窗体

java核心学习(二十一) 多线程---创建启动线程的三种方式

本节开始java多线程编程的学习,对于操作系统.进程.线程的基本概念不再赘述,只是了解java对于多线程编程的支持有哪些. 一.继承Thread类来创建线程 java语言中使用Thread类来代表线程,代表线程的类可以通过继承Thread类并重写run()方法来实现多线程开发,调用线程类实例的start方法来启动该线程.下面来试一试 package ThreadTest; public class FirstThread extends Thread{ private int i; public

父控件、子控件

1 每一个控件其实都是一个容器可以将其他控件放到该控件的内部比较常见的还是将UIView作为容器 2 可以将A控件放入B控件A控件是B控件的子控件B控件是A控件的父控件 3 每一个控制器都有一个UIView控制器本身是不可见能够看到的是控制器的View每一个控制器中都一个UIVIew的属性控制器中管理的所有子控件都是该控件的子控件

多线程——创建新线程

一,简单单线程 线程是代码的执行序列或者执行路径.线程与进程的概念有一些类似,它类似于一个轻量级的进程:一个操作系统可以运行多个进程,一个进程内可以运行多个线程.每个应用程序至少运行在一个线程上.当只有一个线程时,称作单线程应用程序,该线程由系统自动创建. 下面看一个简单单线程例子: 如上图,本短程序从入口函数main进入,然后一次执行到结束. 执行main方法的线程通常被成为主线程,主线程的入口也是应用程序的起始点.对于单线程的应用程序来说,代码的执行是顺序的. 但是在多线程中,当新线程被手动