子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序


最终的程序代码如下:

publicclass ThreadTest {

 

/**

* @paramargs

*/

public static voidmain(String[] args) {

// TODO Auto-generated method stub

new ThreadTest().init();

 

}

 

public void init()

{

final Business business =newBusiness();

new Thread(

new Runnable()

{

 

public voidrun() {

for(inti=0;i<50;i++)

{

business.SubThread(i);

}

}

 

}

 

).start();

 

for(int i=0;i<50;i++)

{

business.MainThread(i);

}

}

 

private class Business

{

booleanbShouldSub =true;//这里相当于定义了控制该谁执行的一个信号灯

public synchronized voidMainThread(int i)

{

if(bShouldSub)

try {

this.wait();

} catch(InterruptedException e) {

// TODO Auto-generatedcatch block

e.printStackTrace();

}

 

for(int j=0;j<5;j++)

{

System.out.println(Thread.currentThread().getName()+ “:i=” + i +”,j=” + j);

}

bShouldSub =true;

this.notify();

 

}

 

 

public synchronized voidSubThread(int i)

{

if(!bShouldSub)

try {

this.wait();

} catch (InterruptedExceptione) {

// TODO Auto-generatedcatch block

e.printStackTrace();

}

 

for(intj=0;j<10;j++)

{

System.out.println(Thread.currentThread().getName()+ “:i=” + i +”,j=” + j);

}

bShouldSub =false;

this.notify();

}

}

}

 

备注:不可能一上来就写出上面的完整代码,最初写出来的代码如下,问题在于两个线程的代码要参照同一个变量,即这两个线程的代码要共享数据,所以,把这两个线程的执行代码搬到同一个类中去:

 

package com.huawei.interview.lym;

 

publicclass ThreadTest {

 

private static booleanbShouldMain=false;

 

public static void main(String[]args) {

// TODO Auto-generated method stub

/*new Thread(){

public void run()

{

for(int i=0;i<50;i++)

{

for(int j=0;j<10;j++)

{

System.out.println(“i=”+ i + “,j=” + j);

}

}

}

 

}.start();*/

 

 

//final String str = newString(“”);

 

new Thread(

new Runnable()

{

public voidrun()

{

for(inti=0;i<50;i++)

{

synchronized(ThreadTest.class) {

if(bShouldMain)

{

try {

ThreadTest.class.wait();}

catch(InterruptedException e) {

e.printStackTrace();

}

}

for(intj=0;j<10;j++)

{

System.out.println(

Thread.currentThread().getName()+

“i=”+ i + “,j=” + j);

}

bShouldMain= true;

ThreadTest.class.notify();

}

}

}

}

).start();

 

for(int i=0;i<50;i++)

{

synchronized (ThreadTest.class){

if(!bShouldMain)

{

try {

ThreadTest.class.wait();}

catch(InterruptedException e) {

e.printStackTrace();

}

}

for(intj=0;j<5;j++)

{

System.out.println(

Thread.currentThread().getName()+

“i=” + i +”,j=” + j);

}

bShouldMain =false;

ThreadTest.class.notify();

}

}

}

 

}

下面使用jdk5中的并发库来实现的:

import java.util.concurrent.Executors;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

import java.util.concurrent.locks.Condition;

 

public class ThreadTest

{

private static Locklock = new ReentrantLock();

private staticCondition subThreadCondition = lock.newCondition();

private staticboolean bBhouldSubThread = false;

public static voidmain(String [] args)

{

ExecutorServicethreadPool = Executors.newFixedThreadPool(3);

threadPool.execute(newRunnable(){

publicvoid run()

{

for(inti=0;i<50;i++)

{

lock.lock();

try

{

if(!bBhouldSubThread)

subThreadCondition.await();

for(intj=0;j<10;j++)

{

System.out.println(Thread.currentThread().getName()+ “,j=” + j);

}

bBhouldSubThread= false;

subThreadCondition.signal();

}catch(Exceptione)

{

}

finally

{

lock.unlock();

}

}

}

 

});

threadPool.shutdown();

for(inti=0;i<50;i++)

{

lock.lock();

try

{

if(bBhouldSubThread)

subThreadCondition.await();

for(intj=0;j<10;j++)

{

System.out.println(Thread.currentThread().getName()+ “,j=” + j);

}

bBhouldSubThread= true;

subThreadCondition.signal();

}catch(Exceptione)

{

}

finally

{

lock.unlock();

}

}

}

}

免责声明:该资源版权归原作者所有,本站只是负责搜集和整理,本站不承担任何技术及版权问题。在本站下载该资源仅提供学习参考和研究,不得用于商业用途,否则一切后果请用户自负。请在下载后在24小时内删除,一切关于该资源商业行为与学士资源网无关。本站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。如有侵权、不妥之处,请联系站长以便及时删除,敬请谅解!侵权/投稿邮箱:zhuanyexueshi@163.com
学士资源网 » 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序

发表评论

学士资源网为大家提供最优质的资源集合

联系学士 资源Q群
嘿,我来帮您!