zoukankan      html  css  js  c++  java
  • 多线程 创建子父线程 保证一件事 子线程执行三次后 父线程执行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();
        }
    }
  • 相关阅读:
    poj 3261 Milk Patterns
    poj 3292 Semi-prime H-numbers
    bzoj千题计划256:bzoj2194: 快速傅立叶之二
    bzoj千题计划255:bzoj3572: [Hnoi2014]世界树
    bzoj千题计划254:bzoj2286: [Sdoi2011]消耗战
    bzoj千题计划253:bzoj2154: Crash的数字表格
    扩展BSGS算法
    bzoj千题计划252:bzoj1095: [ZJOI2007]Hide 捉迷藏
    bzoj千题计划251:bzoj3672: [Noi2014]购票
    bzoj千题计划250:bzoj3670: [Noi2014]动物园
  • 原文地址:https://www.cnblogs.com/ls1783047205/p/9751039.html
Copyright © 2011-2022 走看看