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