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