题目如下:

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

思路如下:

子线程语主线程为互斥,可用SYNCHRONIZED。很容易想到如下代码

package concurrent;  

public class theFirstIdea{  

    /**
* @param args
*/
public static void main(String[] args) { new Thread(//子线程
new Runnable(){
public void run(){
for(int i=1;i<=50;i++){
synchronized(theFirstIdea.class){
for(int j=1;j<=10;j++){
System.out.println("sub thread: "+i+",loop: "+j);
}
}
}
}
}
).start(); new Thread(//主线程
new Runnable(){
public void run(){
for(int i=1;i<=50;i++){
synchronized(theFirstIdea.class){
for(int j=1;j<=100;j++){
System.out.println("main thread: "+i+",loop: "+j);
}
}
}
}
}
).start();
} }

由于运行结果很长(有5500行),所以在Eclipse 编译器无法全部看到,或看到的并不是最终运行结果。所以可以在Run -- Run configuration -- Common --勾选File,点击File System.选择到你想保存运行结果的地方,比如桌面,命名为1.txt. 此时桌面将会生产一个名为1.txt的文件,再次运行程序后,运行结果将保存到此文件中。便于查看。

查看后发现,基本达到要求,但并没有交替执行子线程和主线程。

而且上述代码不好,没有体现Java 的高类聚性,最好能将共同数据或共同方法归为同一类,即编写一个类来存放两个线程,便于修改。代码如下

package concurrent;  

public class theFirstIdea{  

    /**
* @param args
*/
public static void main(String[] args) { final MyThread threads=new MyThread();
new Thread(//子线程
new Runnable(){
public void run(){
for(int i=1;i<=50;i++){
threads.subThread(i);
}
}
}
).start(); for(int i=1;i<=50;i++){
threads.mainThread(i);
}
}
} class MyThread{
public synchronized void subThread(int i){
for(int j=1;j<=10;j++){
System.out.println("sub thread: "+i+",loop: "+j);
}
}
public synchronized void mainThread(int i){
for(int j=1;j<=10;j++){
System.out.println("main thread: "+i+",loop: "+j);
}
}
}

要让他们交替进行,可用信号量控制,并用wait  ,notify 进行线程间通信。易得

//子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,
//接着再回到主线程又循环100,如此循环50次,请写出程序。 public class ThreadTest{ public static void main(String[] args) { final MyThread threads=new MyThread();
new Thread(
new Runnable(){
public void run(){
for(int i=1;i<=50;i++){
threads.subThread(i);
}
}
}
).start();
new Thread(new Runnable(){
public void run(){
for(int i=1;i<=50;i++){
threads.mainThread(i);
}
}
}).start();
}
} class MyThread{
boolean bShouldSub=true;//标志子线程方法是否被调用
public synchronized void subThread(int i){
if(!bShouldSub){//若子线程没被调用,即主线程正在运行,所以等待
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=1;j<=10;j++){
System.out.println("sub thread :"+i+",loop : "+j);
}
bShouldSub=false;//子线程运行完毕
this.notify();//唤醒其他线程,即主线程
}
public synchronized void mainThread(int i){
if(bShouldSub){//若子线程正在被调用,所以等待
try {
this.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int j=1;j<=100;j++){
System.out.println("main thread :"+i+",loop : "+j);
}
bShouldSub=true;//主线程调用完毕
this.notify();//唤醒子线程
}
}

转自:http://blog.csdn.net/carlosli/article/details/8738960

【Java面试题】30 子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。的更多相关文章

  1. 如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true

    下面这篇文章是从StackOverflow来的.LZ面试的时候遇到了一道面试题:“如果有三个Bool型变量,请写出一程序得知其中有2个以上变量的值是true”,于是LZ做了下面的这样的程序: bool ...

  2. 请写出一段JavaScript代码,要求页面有一个按钮,点击按钮弹出确认框。程序可以判断出用

    请写出一段JavaScript代码,要求页面有一个按钮,点击按钮弹出确认框.程序可以判断出用 户点击的是“确认”还是“取消”. 解答: <HTML> <HEAD> <TI ...

  3. 设计四个线程,当中共两个线程每次对j添加1,另外两个线程每次对j降低1。循环100次,写出程序。

    package cn.usst.DataTest6; /** * 设计四个线程,当中共两个线程每次对j添加1,另外两个线程每次对j降低1.循环100次,写出程序. * @ * */ public cl ...

  4. 设计四个线程,其中两个线程每次对j增加1,另外两个线程对j每次减1,写出程序

    /* * 设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1.写出程序. */ public class ThreadTest { private int j; public sta ...

  5. 请写出正则表达式(regex),取得下列黄色部分的字符串 TEL: 02-236-9655/9659 FAX:02-236-9654 (黄色部分即02-236-9655/9659 ) ( 测试面试题)

    请写出正则表达式(regex),取得下列黄色部分的字符串 TEL: 02-236-9655/9659 FAX:02-236-9654 答: package test1; import java.uti ...

  6. 前端一面/面试常考题1-页面布局:假设高度已知,请写出三栏布局,其中左栏、右栏宽度各为300px,中间自适应。

    题目:假设高度已知,请写出三栏布局,其中左栏.右栏宽度各为300px,中间自适应. [题外话:日常宣读我的目标===想要成为一名优雅的程序媛] 一.分析 1. 题目真的像我们想得这么简单吗? 其实不然 ...

  7. C# - 习题02_写出程序的输出结果a.Fun()

    时间:2017-08-23 整理:byzqy 题目:写出程序的输出结果: 文件:Program.cs 1 using System; 2 3 namespace Interview1 4 { 5 pu ...

  8. C# - 习题01_写出程序的输出结果a.Fun2(b)、b.Fun2(a)

    时间:2017-08-23 整理:byzqy 题目:请写出下列程式的结果: 文件:A.cs 1 using System; 2 3 namespace InterView 4 { 5 public c ...

  9. 请写出5种常见到的runtime exception。

    请写出5种常见到的runtime exception. 解答: NullPointerException:当操作一个空引用时会出现此错误. NumberFormatException:数据格式转换出现 ...

随机推荐

  1. t-sql的一些经验

    1.存储过程的3种传回值: 1.以return传回整数 2.以output格式传回参数 3.recordset 2.字符串类型的变量需要初始化后再使用,不然永远是空 DECLARE @FieldsSq ...

  2. 批处理学习笔记1 - Hellow World

    记录自己学习批处理的一点总结吧. 批处理的好处: 可以配合vs,在build完文件之后执行自己的批处理命令. 可以批量修改文件名,或者进行复杂的查询等,对文件可编程操作. 从Hellow world开 ...

  3. [na][QoS]cisco3560限速配置案例-收集于网工泡泡

    网络中常用到这些:CISCO和H3C-MAC过滤+端口限速+端口镜像+端口隔离 不同的方式不同的思想:嘎嘎 其他各个厂商的限速链接:http://pan.baidu.com/s/1hrIMoSG 密码 ...

  4. CCMotionStreak(一)

    void MotionStreakTest1::onEnter() { MotionStreakTest::onEnter(); CCSize s = CCDirector::sharedDirect ...

  5. GetLastError()返回值大全

    [0]-操作成功完成.[1]-功能错误.[2]-系统找不到指定的文件.[3]-系统找不到指定的路径.[4]-系统无法打开文件.[5]-拒绝访问.[6]-句柄无效.[7]-存储控制块被损坏.[8]-存储 ...

  6. shell echo -n md5sum使用方法

    #!/bin/bash MYSQL='mysql -u*** -p*** -hws5 account' tmp="tmp" resultsource="resultsou ...

  7. 手风琴式焦点图jQuery特效

    手风琴式焦点图jQuery特效是一款鼠标点击人物图像滑动切换案例说明信息代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="ag-cont ...

  8. HttpClient-4.3.X 中get和post方法使用

    转自:http://linhongyu.blog.51cto.com/6373370/1538672 一.简介 HttpClient是Apache Jakarta Common下的子项目,用来提供高效 ...

  9. 也来看看hadoop的WordCount

    其实这个例子都是书上的,我也只是拿过来理解学习下. WordCount是Hadoop中的Hello, world,这是我听得最多的一个表述. 下面是WordCount.java的源码 package ...

  10. 通过buildroot 移植 libsocketcan.so 以及 can 工具

    进入buildroot make menuconfig Target packages ---> Networking applications ---> [*] can-utils // ...