子線程循環3次,接着主線程循環6,接着又回到子線程循環3次,接着再回到主線程又循環6,如此循環10次.

package cglib;java

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;ide

public class jiekou{
    //private int j;
    //private Lock lock=new ReentrantLock();
    public static void main(String args[]){
         System.out.println("線程:"+Thread.currentThread().getName());
         jiekou jiekou =new jiekou();
         jiekou.add();
         System.out.println("線程哈:"+Thread.currentThread().getName());
    }
        public  void add(){
            final Business business =new Business();
            new Thread(new Runnable(){this

                @Override
                public void run() {
                    // TODO Auto-generated method stub
                    for(int i=0;i<10;i++){
                        business.SubThread(i);
                        
                    }
                }},"SubThread").start();
            
            new Thread(new Runnable(){  
                public void run(){  
                    for(int i=1;i<=10;i++){  
                        business.MainThread(i);  
                    }  
                }  
            },"MainThread").start();
            }
        }
        
 class Business{
            boolean bShouldSub =true;//這裏至關於定義了控制該誰執行的一個信號燈,true 時主進程等待,false時子進程等待
        
            public synchronized void MainThread(int i)
            {
            if(bShouldSub){
                try {
                    System.out.println("主線程wait……");
                    this.wait();
                } catch(InterruptedException e) {
                    // TODO Auto-generatedcatch block
                    e.printStackTrace();
                }
            }
            System.out.println("主線程Start……");
            for(int j=0;j<6;j++)
            {
            System.out.println(Thread.currentThread().getName()+ ":i=" + i +",j=" + j);
            }
            
            bShouldSub =true;//子線程運行完畢  
            this.notify();//喚醒其餘線程,即主線程  
            }
            
        
        
        public synchronized void SubThread(int i)
        {
        if(!bShouldSub){//若是bShouldSub爲false  子進程就釋放同步鎖
            try {
                System.out.println("子線程wait……");
                this.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generatedcatch block
                e.printStackTrace();
            }
        }
        System.out.println("子線程Start……");
        for(int j=0;j<3;j++)
        {
        System.out.println(Thread.currentThread().getName()+ ":i=" + i +",j=" + j);
        }
        bShouldSub =false;//主線程調用完畢  
        this.notify();//喚醒子線程  
        }
    }線程

 

 

輸出:進程

線程:main
子線程Start……
SubThread:i=0,j=0
SubThread:i=0,j=1
SubThread:i=0,j=2
子線程wait……
線程哈:main
主線程Start……
MainThread:i=1,j=0
MainThread:i=1,j=1
MainThread:i=1,j=2
MainThread:i=1,j=3
MainThread:i=1,j=4
MainThread:i=1,j=5
主線程wait……
子線程Start……
SubThread:i=1,j=0
SubThread:i=1,j=1
SubThread:i=1,j=2
子線程wait……
主線程Start……
MainThread:i=2,j=0
MainThread:i=2,j=1
MainThread:i=2,j=2
MainThread:i=2,j=3
MainThread:i=2,j=4
MainThread:i=2,j=5
主線程wait……
子線程Start……
SubThread:i=2,j=0
SubThread:i=2,j=1
SubThread:i=2,j=2
主線程Start……
MainThread:i=3,j=0
MainThread:i=3,j=1
MainThread:i=3,j=2
MainThread:i=3,j=3
MainThread:i=3,j=4
MainThread:i=3,j=5
主線程wait……
子線程Start……
SubThread:i=3,j=0
SubThread:i=3,j=1
SubThread:i=3,j=2
子線程wait……
主線程Start……
MainThread:i=4,j=0
MainThread:i=4,j=1
MainThread:i=4,j=2
MainThread:i=4,j=3
MainThread:i=4,j=4
MainThread:i=4,j=5
主線程wait……
子線程Start……
SubThread:i=4,j=0
SubThread:i=4,j=1
SubThread:i=4,j=2
子線程wait……
主線程Start……
MainThread:i=5,j=0
MainThread:i=5,j=1
MainThread:i=5,j=2
MainThread:i=5,j=3
MainThread:i=5,j=4
MainThread:i=5,j=5
主線程wait……
子線程Start……
SubThread:i=5,j=0
SubThread:i=5,j=1
SubThread:i=5,j=2
子線程wait……
主線程Start……
MainThread:i=6,j=0
MainThread:i=6,j=1
MainThread:i=6,j=2
MainThread:i=6,j=3
MainThread:i=6,j=4
MainThread:i=6,j=5
主線程wait……
子線程Start……
SubThread:i=6,j=0
SubThread:i=6,j=1
SubThread:i=6,j=2
子線程wait……
主線程Start……
MainThread:i=7,j=0
MainThread:i=7,j=1
MainThread:i=7,j=2
MainThread:i=7,j=3
MainThread:i=7,j=4
MainThread:i=7,j=5
主線程wait……
子線程Start……
SubThread:i=7,j=0
SubThread:i=7,j=1
SubThread:i=7,j=2
子線程wait……
主線程Start……
MainThread:i=8,j=0
MainThread:i=8,j=1
MainThread:i=8,j=2
MainThread:i=8,j=3
MainThread:i=8,j=4
MainThread:i=8,j=5
主線程wait……
子線程Start……
SubThread:i=8,j=0
SubThread:i=8,j=1
SubThread:i=8,j=2
子線程wait……
主線程Start……
MainThread:i=9,j=0
MainThread:i=9,j=1
MainThread:i=9,j=2
MainThread:i=9,j=3
MainThread:i=9,j=4
MainThread:i=9,j=5
主線程wait……
子線程Start……
SubThread:i=9,j=0
SubThread:i=9,j=1
SubThread:i=9,j=2
主線程Start……
MainThread:i=10,j=0
MainThread:i=10,j=1
MainThread:i=10,j=2
MainThread:i=10,j=3
MainThread:i=10,j=4
MainThread:i=10,j=5get

 

package cglib;同步


import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;it

public class jiekou{
    private static Lock lock = new ReentrantLock();  
    private static Condition subThreadCondition = lock.newCondition();  
    private static boolean bBhouldSubThread = false;  
    public static void main(String [] args)  
    {  
        ExecutorService threadPool = Executors.newFixedThreadPool(3);  
        threadPool.execute(new Runnable(){  
            public void run()  
            {  
                for(int i=0;i<10;i++)  
                {  
                    lock.lock();                      
                    try  
                    {                     
                        if(!bBhouldSubThread){
                            System.out.println("子線程等待");
                            subThreadCondition.await();
                        }
                        System.out.println("子線程開始");
                        for(int k=0;k<3;k++)  
                        {   
                            
                            System.out.println(Thread.currentThread().getName() + ",k=" + k+ ",i=" + i);  
                        }  
                        bBhouldSubThread = false;  
                        subThreadCondition.signal();  
                    }catch(Exception e)  
                    {                         
                    }  
                    finally  
                    {  
                        lock.unlock();  
                    }  
                }             
            }  
              
        });  
        threadPool.shutdown();
        
        for(int i=0;i<10;i++)  
        {  
                lock.lock();                      
                try  
                {     
                    if(bBhouldSubThread) {
                        System.out.println("主線程等待");
                        subThreadCondition.await();
                    }
                    System.out.println("主線程開始");                                   
                    for(int j=0;j<6;j++)  
                    {  
                        
                        System.out.println(Thread.currentThread().getName() + ",j=" + j+",i=" + i);  
                    }  
                    bBhouldSubThread = true;  
                    subThreadCondition.signal();                      
                }catch(Exception e)  
                {                         
                }  
                finally  
                {  
                    lock.unlock();  
                }                     
        }  
    }
        }
    
    
        io

    輸出:class

主線程開始 main,j=0,i=0 main,j=1,i=0 main,j=2,i=0 main,j=3,i=0 main,j=4,i=0 main,j=5,i=0 主線程等待 子線程開始 pool-1-thread-1,k=0,i=0 pool-1-thread-1,k=1,i=0 pool-1-thread-1,k=2,i=0 子線程等待 主線程開始 main,j=0,i=1 main,j=1,i=1 main,j=2,i=1 main,j=3,i=1 main,j=4,i=1 main,j=5,i=1 主線程等待 子線程開始 pool-1-thread-1,k=0,i=1 pool-1-thread-1,k=1,i=1 pool-1-thread-1,k=2,i=1 子線程等待 主線程開始 main,j=0,i=2 main,j=1,i=2 main,j=2,i=2 main,j=3,i=2 main,j=4,i=2 main,j=5,i=2 主線程等待 子線程開始 pool-1-thread-1,k=0,i=2 pool-1-thread-1,k=1,i=2 pool-1-thread-1,k=2,i=2 子線程等待 主線程開始 main,j=0,i=3 main,j=1,i=3 main,j=2,i=3 main,j=3,i=3 main,j=4,i=3 main,j=5,i=3 主線程等待 子線程開始 pool-1-thread-1,k=0,i=3 pool-1-thread-1,k=1,i=3 pool-1-thread-1,k=2,i=3 子線程等待 主線程開始 main,j=0,i=4 main,j=1,i=4 main,j=2,i=4 main,j=3,i=4 main,j=4,i=4 main,j=5,i=4 主線程等待 子線程開始 pool-1-thread-1,k=0,i=4 pool-1-thread-1,k=1,i=4 pool-1-thread-1,k=2,i=4 子線程等待 主線程開始 main,j=0,i=5 main,j=1,i=5 main,j=2,i=5 main,j=3,i=5 main,j=4,i=5 main,j=5,i=5 主線程等待 子線程開始 pool-1-thread-1,k=0,i=5 pool-1-thread-1,k=1,i=5 pool-1-thread-1,k=2,i=5 子線程等待 主線程開始 main,j=0,i=6 main,j=1,i=6 main,j=2,i=6 main,j=3,i=6 main,j=4,i=6 main,j=5,i=6 主線程等待 子線程開始 pool-1-thread-1,k=0,i=6 pool-1-thread-1,k=1,i=6 pool-1-thread-1,k=2,i=6 子線程等待 主線程開始 main,j=0,i=7 main,j=1,i=7 main,j=2,i=7 main,j=3,i=7 main,j=4,i=7 main,j=5,i=7 主線程等待 子線程開始 pool-1-thread-1,k=0,i=7 pool-1-thread-1,k=1,i=7 pool-1-thread-1,k=2,i=7 子線程等待 主線程開始 main,j=0,i=8 main,j=1,i=8 main,j=2,i=8 main,j=3,i=8 main,j=4,i=8 main,j=5,i=8 主線程等待 子線程開始 pool-1-thread-1,k=0,i=8 pool-1-thread-1,k=1,i=8 pool-1-thread-1,k=2,i=8 子線程等待 主線程開始 main,j=0,i=9 main,j=1,i=9 main,j=2,i=9 main,j=3,i=9 main,j=4,i=9 main,j=5,i=9 子線程開始 pool-1-thread-1,k=0,i=9 pool-1-thread-1,k=1,i=9 pool-1-thread-1,k=2,i=9

相關文章
相關標籤/搜索