Java多线程基础(四)Java传统线程同步通信技术

Java多线程基础(四)Java传统线程同步通信技术

编写代码实现以下功能

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

分析

1)子线程循环10次与主线程循环100次必须是互斥的执行,不能出现交叉,下面代码中通过synchronized关键字实现此要求;

2)子线程与主线程必须交替出现,可以通过线程同步通信技术实现,下面代码中通过bShouldSub变量实现此要求;

其他需要注意的地方

1)其中business变量必须声明为final类型,因为在匿名内部类和局部内部类中调用的局部变量必须是final的,这样保证:

- 变量的一致性(编译时final变量会被复制一份作为局部内部类的变量);

- 并避免局部变量的生命周期与局部内部类的对象的生命周期不一致。

否则,

- 若该变量被传入局部内部类之后,局部变量在外部类中被修改,则内部类中该变量的值与外部类中不一致,可能导致不可预知的情况发生;

- 或是导致局部变量生命周期随着方法的结束而从栈中清除,局部内部类访问一个已不存在的变量。

若是成员变量,则不需要是final的。

详情可参考以下文章:

http://feiyeguohai.iteye.com/blog/1500108

http://blog.csdn.net/whuslei/article/details/6251020

2)内部类分为成员内部类、静态内部类、局部内部类、匿名内部类四种,四者的生命周期及详细使用方法请自行问谷歌或度娘。

代码实现

package cn.king;

public class TraditionalThreadCommunication {

    public static void main(String[] args) {
        // 必须声明为final
        final Business business = new Business();
        new Thread(
                new Runnable() {

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

                }
                ).start();

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

}

class Business {
    // 该变量用于线程间通信
    private boolean bShouldSub = true;
    public synchronized void sub(int i) {
        if(!bShouldSub) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for(int j=1; j<=10; j++) {
            System.out.println("sub thread sequence of "
                                + j + ", loop of " + i);
        }
        bShouldSub = false;
        this.notify();
    }
    public synchronized void main(int i) {
        if(bShouldSub) {
            try {
                this.wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        for(int j=1; j<=100; j++) {
            System.out.println("main thread sequence of "
                                + j + ", loop of " + i);
        }
        bShouldSub = true;
        this.notify();
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 11:53:54

Java多线程基础(四)Java传统线程同步通信技术的相关文章

JAVA 并发编程-传统线程同步通信技术(四)

首先介绍几个概念: wait()方法 wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法. 当前的线程必须拥有当前对象的monitor,也即lock,就是锁. 线程调用wait()方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify()或者notifyAll()方法),这样它才能重新获得锁的拥有权和恢复执行. 要确保调用wait()方法的时候拥有锁,即,wait()方法的调用必须放在synchronized方法或s

Java多线程(三)、线程同步(转)

Java多线程(三).线程同步 分类: javaSE综合知识点 2012-09-18 17:59 2400人阅读 评论(0) 收藏 举报 在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的控制吧. 由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数

Java多线程基础:进程和线程之由来

在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编程.当然,Java并发编程涉及到很多方面的内容,不是一朝一夕就能够融会贯通使用的,需要在实践中不断积累.由于并发肯定涉及到多线程,因此在进入并发编程主题之前,我们先来了解一下进程和线程的由来,这对后面对并发编程的理解将会有很大的帮助. 下面是本文的目录大纲: 一.操作系统中为什么会出现进程? 二.为什么会出现线程? 三.多线程并发 若有不正之处,请多多谅解并欢迎指正. 请尊重作者劳动成果,转载请标明原文地址:

Java多线程(四)、线程池(转)

Java多线程(四).线程池 分类: javaSE综合知识点 2012-09-19 17:46 3943人阅读 评论(1) 收藏 举报 系统启动一个新线程的成本是比较高的,因为它涉及到与操作系统的交互.在这种情况下,使用线程池可以很好的提供性能,尤其是当程序中需要创建大量生存期很短暂的线程时,更应该考虑使用线程池. 与数据库连接池类似的是,线程池在系统启动时即创建大量空闲的线程,程序将一个Runnable对象传给线程池,线程池就会启动一条线程来执行该对象的run方法,当run方法执行结束后,该线

4.传统线程同步通信技术

1 /** 2 * 传统线程同步通信技术 3 * 4 * ******************************************* 5 * 经验: 6 * 要用到共同数据(包括共同锁)或共同算法的若干个方法应该 7 * 归在用一个类身上,这种设计正好体现了高内聚和程序的健壮性. 8 * 9 * ******************************************* 10 * 11 * @author LiTaiQing 12 */ 13 public class T

【好程序员训练营】-Java多线程与并发(二)之线程同步

android培训--我的java笔记,期待与您交流! 线程同步 1 . 多线程共享数据 在多线程操作中, 多个线程有可能同时处理同一个资源, 这就是多线程中的共享数据. 举个不太恰当的例子简单理解一下,图中是小新家的厕所茅坑,但是家里只有一个那这就是一个"资源",那么家里的所有人都共享这同一个"资源",也就是所谓的多线程共享数据 可以明显的看出多线程共享数据带来的问题,就是会造成数据的不确定性!就好比小新正在上着厕所,此时小新爸爸来了, 此时相当于一个资源两个人在

【java并发】传统线程同步通信技术

先看一个问题: 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次--如此往返执行50次. 看完这个问题,很明显要用到线程间的通信了, 先分析一下思路:首先肯定要有两个线程,然后每个线程中肯定有个50次的循环,因为每个线程都要往返执行任务50次,主线程的任务是执行5次,子线程的任务是执行10次.线程间通信技术主要用到wait()方法和notify()方法.wait()方法会导致当前线程等待,并释放所持有的锁,notify()方法表示唤醒在此对象监视器

传统线程同步通信技术

先看一个问题: 有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10,再主线程执行5次--如此往返执行50次. 看完这个问题,很明显要用到线程间的通信了, 先分析一下思路:首先肯定要有两个线程,然后每个线程中肯定有个50次的循环,因为每个线程都要往返执行任务50次,主线程的任务是执行5次,子线程的任务是执行10次.线程间通信技术主要用到 wait() 方法和 notify() 方法.wait() 方法会导致当前线程等待,并释放所持有的锁,notify() 方法表示唤醒在

【Java多线程与并发库】4.传统线程同步通信技术

我们先通过一道面试题来了解传统的线程同步通信. 题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序. 我没有看答案,先用自己的思路写了一段代码,有一些是借鉴传统的“生产者与消费者”的多线程模型写出来的:[java] view plain copy 在CODE上查看代码片派生到我的代码片package cn.edu.hpu.test; /** * 要求的操作: * 子线程循环10次,接着主线程循环100次,接着又回