博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程通信笔试题
阅读量:5037 次
发布时间:2019-06-12

本文共 1984 字,大约阅读时间需要 6 分钟。

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

问题描述:

子线程循环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();        }    }}

 

转载于:https://www.cnblogs.com/DarrenChan/p/5743219.html

你可能感兴趣的文章
Bean的Scope
查看>>
【BZOJ】3142: [Hnoi2013]数列
查看>>
http初探
查看>>
elasticsearch的安装
查看>>
__next__()
查看>>
爬取:中国大学排名
查看>>
聊天室(C++客户端+Pyhton服务器)_1.框架搭设
查看>>
UpdatePanel 内控件 更新“外的”控件【转】
查看>>
mybatis中&gt;=和&lt;=的实现方式
查看>>
Python面向对象03/继承
查看>>
java序列化和反序列化
查看>>
绝对定位
查看>>
flink源码编译(windows环境)
查看>>
dpkg 删除 百度网盘 程序
查看>>
服务器nginx安装
查看>>
std::nothrow
查看>>
rest-framework 分页器
查看>>
JQuery(一)安装&选择器 样式篇
查看>>
浏览器的DNS缓存查看和清除
查看>>
浏览器跨域问题
查看>>