关于线程的一到面试题

节录于<<张孝祥-Java多线程与并发库高级应用>>

题目概述

主线程执行10次 然后子线程执行5次 接着主线程再执行10次 子线程执行5次....一直循环50次。

首先我们应该明白我们的线程逻辑在于

"主线程执行10次 然后子线程执行5次"

至于循环50次不是我们最核心的业务逻辑。

因而我们先把"主线程执行10次 然后子线程执行5次"放到一个类中。

第一步

class Business{
     public  void main(int j){  //j作为最大的那个50次循环
     for(int i=1;i<=10;i++)
         System.out.println("main "+i+" of loop "+j);
     }

     public  void sub(int j){  //j作为最大的那个50次循环
     for(int i=1;i<=5;i++)
         System.out.println("sub "+i+" of loop "+j);
     }
}

然后就简单了,我们做出调用的类

public class TraditionalCommunication{
     public static void main(String[] args){
           final Business b=new Business();

       new Thread(
           new Runnable(){
             public void run(){
            for(int i=1;i<=50;i++)
               b.sub(i);
         }
           }
       ).start();
    for(int i=1;i<=50;i++)
       b.main(i);
     }
}

如果就是现在这个代码去运行。看到的结果肯定是杂乱无章的。

可能父线程刚走了一圈(输出了一行代码),子线程就抢过了执行权。

第二步

所以只是我们得给business的两个方法,main与sub加上synchronized。

这个时候再测试,最起码两个线程(父线程子线程)不会互相干扰(互斥),但是还有可能父线程接连着运行了两圈(输出了20行代码)也就是说,我们让两个线程能互斥,但是不能协调的通信。(他们没有交替输出!)

第三步

class Business{

      private boolean shouldsub=true;  //这个变量名 起的很不错
     public synchronized void main(int j){  //j作为最大的那个50次循环
     if(shouldsub){
    try{
        this.wait();
    }catch(Exception e){ }
     }
     for(int i=1;i<=10;i++)
         System.out.println("main "+i+" of loop "+j);
     shouldsub=true;  //父线程已经执行了一次 所以shouldsub为true 该子线程执行了
     this.notify();
     }

     public synchronized void sub(int j){  //j作为最大的那个50次循环
     if(!shouldsub){
    try{
        this.wait();
    }catch(Exception e){ }
     }
     for(int i=1;i<=5;i++)
         System.out.println("sub "+i+" of loop "+j);
     shouldsub=false;  //子线程已经执行了一次 所以shouldsub为false 不能再执行了
     this.notify();
     }
}

这下OK了。大家看看还有可以修改的地方么?

     if(!shouldsub){
    try{
        this.wait();
    }catch(Exception e){ }
     }
应该改成下面的形式
     while(!shouldsub){
    try{
      this.wait();
    }catch(Exception e){}
     }

为什么?

因为有的时候线程会被"假唤醒",用while循环可以再判断一回。

其实写完代码,我仍然觉得这个题的关键就是把business类抽象出来,提炼出真正核心的业务逻辑。

时间: 2024-12-25 13:58:52

关于线程的一到面试题的相关文章

多线程——线程的运行状态(面试题)

线程的启动使用的是start()方法,但是并不是意味着调用了start方法就立刻启动多线程. 线程转换状态: 当多线程调用了start()方法之后并不是立刻执行,而是进入了就绪状态,等待进行调度后执行.调度就是需要将资源分配给程序运行后才可以执行多线程中的代码(run中的代码).但这个程序并不是一直执行的,在执行了一段时间之后,需要让出资源,让其它线程来继续执行.即run方法可能还没执行完,可能只执行了一半,那么这个时候让出资源,随后要重新进入就绪状态,重新等待分配新资源,再继续执行.当线程执行

Java线程经典面试题

53道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并

Java线程面试题 Top 50

原文链接: javarevisited 翻译: ImportNew.com- 李 广译文链接: http://www.importnew.com/12773.html 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关的问题在面试中经常会被提到. 在典型的Java面试中, 面试官会从线程

【转】Java线程面试题Top50

目录(?)[-] 50道Java线程面试题 1 什么是线程 2 线程和进程有什么区别 3 如何在Java中实现线程 4 用Runnable还是Thread 6 Thread 类中的start 和 run 方法有什么区别 7 Java中Runnable和Callable有什么不同 8 Java中CyclicBarrier 和 CountDownLatch有什么不同 9 Java内存模型是什么 10 Java中的volatile 变量是什么 11 什么是线程安全Vector是一个线程安全类吗 详见这

疯狂Java学习笔记(59)-----------50道Java线程面试题

50道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点.欲了解更多详细信息请点击这里. 2) 线程和进程有什么区别? 线程是进程的子集,一个

Java线程面试题 Top 50(转)

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关的问题在面试中经常会被提到. 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像在J

【转】Java线程面试题 Top 50

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎.大多数待遇丰厚的Java开发职位都要求开发者精通多线程技术并且有丰富的Java程序开发.调试.优化经验,所以线程相关的问题在面试中经常会被提到. 在典型的Java面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像在J

Java 线程面试题 Top 50

--> html { line-height: 1.6 } body { font-family: -apple-system-font, "Helvetica Neue", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", sans-serif; background-color: #f3f3f3; line-height: inherit } body.ric

Java线程面试题Top50

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java 语言一个重要的特点就是内置了对并发的支持,让 Java 大受企业和程序员的欢迎.大多数待遇丰厚的 Java 开发职位都要求开发者精通多线程技术并且有丰富的 Java 程序开发.调试.优化经验,所以线程相关的问题在面试中经常会被提到. 在典型的 Java 面试中, 面试官会从线程的基本概念问起, 如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较好(比如:继承 thread 类还是调用 Runnable 接口),