您的位置:首页 > 其它

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

2016-11-02 00:00 423 查看
package cglib;

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

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(){

@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=5

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;

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();
}
}
}
}

输出:

主线程开始
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐