首页 > 学院 > 开发设计 > 正文

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

2019-11-08 01:11:14
字体:
来源:转载
供稿:网友

最近经常为公司面试新人,问了一个简单的线程问题,许多培训机构也都出过这种练习题,题目如标题

package thread;/** * 线程类 * @author  zy * */public class ExecutorThread{	/**	 * 标志子线程调用方法是否被调用	 */	PRivate boolean mainIsRunning = false;		/**	 * 子线程调用方法	 */	public synchronized void sub(){				while(mainIsRunning){//如果子线程方法没被调用,即调用了主线程执行			//等待别的线程使用			try {				this.wait();			} catch (InterruptedException e) {				e.printStackTrace();			}		}		for(int i = 0 ;i<10;i++){			System.out.println("sub:" + i);		}				mainIsRunning = true;		//唤醒别的在等待的线程		this.notify();			}		/**	 * 主线程调用方法	 */	public synchronized void main(){		while(!mainIsRunning){//如果主线程没被调用,即子线程执行			try {				this.wait();			} catch (InterruptedException e) {				// TODO Auto-generated catch block				e.printStackTrace();			}		}		for(int i = 0 ;i<100;i++){			System.out.println("main:" + i);		}		mainIsRunning = false;		this.notify();			}}
package thread;public class ExecutorThreadTest {	public static void main(String[] args) {		final ExecutorThread thread = new ExecutorThread();		new Thread(new Runnable() {			@Override			public void run() {				for (int i = 0; i < 50; i++) {					System.out.println("sub is " + i + "  count");					thread.sub();				}			}		}).start();		for (int i = 0; i < 50; i++) {			System.out.println("main is " + i + "  count");			thread.main();		}	}}能运行通过

试问,如果我把代码修改成这样还能正常运行么?为什么

package thread;/** * 线程类 * @author  zy * */public class ExecutorThread{	/**	 * 标志子线程调用方法是否被调用	 */	private boolean mainIsRunning = false;		/**	 * 子线程调用方法	 */	public synchronized void sub(){				for(int i = 0 ;i<10;i++){			System.out.println("sub:" + i);		}				mainIsRunning = true;		//唤醒别的在等待的线程		this.notify();		try {			this.wait();		} catch (InterruptedException e) {			e.printStackTrace();		}	}		/**	 * 主线程调用方法	 */	public synchronized void main(){		for(int i = 0 ;i<100;i++){			System.out.println("main:" + i);		}		mainIsRunning = false;		this.notify();		try {			this.wait();		} catch (InterruptedException e) {			// TODO Auto-generated catch block			e.printStackTrace();		}	}}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表