多线程通信笔试题

一道关于多线程通信的笔试题,个人觉得值得推荐。
问题描述:

子线程循环10次,主线程循环100次,接着又回到子线程循环10次,接着又回到主线程循环100次。以此类推,总共循环50次。
问题分析:

显然,这是一道多线程的问题。由于开启多个线程之后,是靠CPU分发时间片运行的,谁拿到时间片谁运行。但是可能A线程刚好运行到一半,时间片就给了B线程,这样就会导致数据产生错误。由此,我们用synchronized进行上锁,即便拿到时间片,但由于上锁的对象(即钥匙)别的线程没有释放,所以也只能干等,直到时间片又被对方拿走,这样就避免了数据的错误。本题中,涉及到了两个线程循环执行,显然需要考虑线程间的通信,即wait()和notify()。这两个方法是object类的方法,如果在线程A中调用了obj.wait()方法,那么A就停止等待,等到其他线程调用obj.notify()方法为止。这时,obj显然成了多个线程之间的通信手段。
这里还要强调一点,wait()和notify()不可以轻易调用,他们必须包含在对应的synchronized语句中,他们都需要首先获得目标对象的一个监视器。
问题求解:

package thread;

public class Demo5 {
    public static void main(String[] args) {
        final Business business = new Business();
        new Thread(new Runnable() {

            @Override
            public void run() {
                for (int i = 0; i < 50; i++) {
                    business.sub(i);
                }
            }
        }).start();

        for (int i = 0; i < 50; i++) {
            business.main(i);
        }
    }

    static class Business {
        // 是否轮到子线程
        boolean isSub = true;

        public synchronized void sub(int i) {
            // 如果没有轮到子线程,进去就阻塞
            if (!isSub) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int j = 0; j < 10; j++) {
                System.out.println("循环次数:" + (i + 1) + ",子线程" + (j + 1));
            }
            isSub = false;
            this.notify();
        }

        public synchronized void main(int i) {
            // 如果没有轮到主线程,进去就阻塞
            if (isSub) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            for (int j = 0; j < 100; j++) {
                System.out.println("循环次数:" + (i + 1) + ",主线程" + (j + 1));
            }
            isSub = true;
            this.notify();
        }
    }
}
时间: 2024-10-20 02:23:18

多线程通信笔试题的相关文章

秒杀多线程第一篇 多线程笔试面试题汇总 ZZ 【多线程】

http://blog.csdn.net/morewindows/article/details/7392749 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. ----------------------

秒杀多线程第一篇 多线程笔试面试题汇总

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 系列前言 本系列是本人参加微软亚洲研究院,腾讯研究院,迅雷面试时整理的,另外也加入一些其它IT公司如百度,阿里巴巴的笔试面试题目,因此具有很强的针对性.系列中不但会详细讲解多线程同步互斥的各种“招式”,而且会进一步的讲解多线程同步互斥的“内功心法”.有了“招式”和“内功心法”,相信你也能对多线程挥洒自如,在笔试面试中顺利的秒杀多线程试题. -------------------------------------华丽的分割线

多线程笔试面试题汇总

第一篇    多线程笔试面试题汇总 本文转载于秒杀多线程系列,原博客地址:http://blog.csdn.net/morewindows/article/details/7392749 多线程在笔试面试中经常出现,下面列出一些公司的多线程笔试面试题.首先是一些概念性的问答题,这些是多线程的基础知识,经常出现在面试中的第一轮面试(我参加2011年腾讯研究院实习生招聘时就被问到了几个概念性题目).然后是一些选择题,这些一般在笔试时出现,虽然不是太难,但如果在选择题上花费大多时间无疑会对后面的编程题

java多线程常见面试题

下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.J 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任务.不同的进程使用不同的内存空间,而所有的线程共享一片相同的内存空间.别把它

多线程通识

1. 了解多线程的思维 线程是用来执行任务的,线程彻底执行完任务A才能去执行任务B.为了同时执行两个任务,产生了多线程. 例子: 我打开一个视频软件,我开辟一个线程A让它执行下载任务,我开辟一个线程B,用来播放视频.我开辟两个线程后,这两个任务能同时执行,如果我开辟一个线程,只有下载任务完成,才能去执行播放任务. 线程相当于店里的服务员,一个服务员同时只能做一件事情,多顾几个服务员,就能同时做很多事情. 2. 进程(学习线程之前,必须要了解一下进程) 1. 进程就是在操作系统中运行的程序.专业点

java学习第22天(关于java中的锁LOCK及多线程的面试题)

在JDK5后,java提供一种更加方便的安全机制,不使用synchronized,针对线程的锁定操作和释放操作使用Lock锁.更加清晰明了.举例: Lock lock=new ReentrantLock(); lock.lock 需要加锁的代码 lock.unlock  为什么说lock更为安全呢?因为synchronized可能会造成死锁现象,具体关于死锁现象可以参考操作系统,就不再多说. 总结下在线程中的主要几个问题 首先是 多线程有几种实现方式 应该上是有三种,第一种继承Thread类,第

多线程经典面试题

1.基本概念 详见:线程和进程关系和区别.同步和互斥.进程间通信 2.以下多线程对int型变量x的操作,哪几个不需要进行同步(D)        A. x=y;      B. x++;    C. ++x;    D. x=1; 详见:多线程二 多线程中的隐蔽问题揭秘 3.多线程中栈与堆是公有的还是私有的 (C) A:栈公有, 堆私有 B:栈公有,堆公有 C:栈私有, 堆公有 D:栈私有,堆私有 4.临界区(Critical Section)和互斥量(Mutex) 两者都可以用于同一进程中不同

实践JAVA wait(), notify(),sleep方法--一道多线程的面试题

建立三个线程,A线程打印10次A,B线程打印10次B,C线程打印10次C,要求线程同时运行,交替打印10次ABC. 这个问题用Object的wait(),notify()就可以很方便的解决. public class MyThreadPrinter2 implements Runnable { private String name; private Object prev; private Object self; private MyThreadPrinter2(String name, O

亚信笔试题

1.JavaEE是技术还是平台还是框架?什么是JavaEE? JavaEE是具有JVM和一组特定API的编写网络应用程序的平台 2.“==”和equals方法究竟有什么区别? 1.基本数据类型,用“==”作比较,比较的是值2.复合数据类型,用“==”比较的是他们在内存中存放地址用equals时,如果该数据类型没有重写equals方法,则与使用“==”结果相同(比如String) 3.接口是否可继承接口?抽象类是否可实现(implements)接口? 1.可以 2.可以 4.如何把一段逗号分割的字