Java多线程模式之Balking模式详解

本文实例讲述了Java多线程模式之Balking模式。分享给大家供大家参考,具体如下:

当现在不适合这个操作,或是没有必要进行这个操作时就直接放弃这个操作而回去。这个就是Balking模式

例如王某在餐厅吃饭,当王某需要点餐时喊服务员需要点餐。当服务员A和B都注意到了王某点餐的示意,这时服务员B看到服务员A已经去响应了王某的点餐请求,所以服务员B就不会再过去响应王某的点餐请求。

程序示例:

程序的需求是模拟一个自动保存的功能。自动保存是为了预防计算机忽然断电或则软件突然出错的危险,定期将数据保存在文件里的功能。

1、Data类:表示是否修改,及修改函数的类
2、SaveThread类:定期保存
3、ChangeThread:修改数据,保存文件
4、Main:模拟数据

package org.zhy.demo04;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
/**
 * 表示是否修改,及修改函数的类
 * @author zhengyi
 *
 */
public class Data {
  private final String fileName; //文件名称
  private String content; //修改内容
  private boolean changed; //是否可以修改
  //构造函数
  public Data(String fileName,String content){
    this.fileName=fileName;
    this.content=content;
  }
  /**
   * 新的修改内容 如果有新的需要保存的数据,changed的属性修改为true
   * 注:这个方法是用synchronized修饰的
   * 为了保护content与changed属性用
   * synchronized修饰后就只能同时有
   * 1个线程访问也就防止了多线程造成的脏数据
   * @param newContent
   */
  public synchronized void change(String newContent){
    content=newContent;
    changed=true;
  }
  /**
   * 保存
   */
  public synchronized void save(){
    if(!changed){ //当changed值为false时直接return出去
      return ;
    }else{
      doSave();//调用保存方法
      changed=false; //保存后changed的值修改为false
    }
  }
  /**
   * 具体的修改方法,模拟写到文本中。
   */
  private void doSave(){
    System.out.println("线程名称:"+Thread.currentThread().getName()+",最新需要保存的值="+content);
    try {
      Writer writer=new FileWriter(fileName);
      writer.write(content);
      writer.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}
package org.zhy.demo04;
/**
 * 定期保存的类
 * @author zhengyi
 *
 */
public class SaveThread extends Thread{
  private Data data;
  public SaveThread(String name,Data data){
    super(name);//线程名称
    this.data=data;
  }
  public void run(){
    try {
      while(true){
        data.save(); //模拟保存方法
        Thread.sleep(1000); //休息1秒
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
package org.zhy.demo04;
import java.util.Random;
/**
 * 修改数据,保存文件的类
 * @author zhengyi
 *
 */
public class ChangeThread extends Thread{
  private Data data;
  private Random random=new Random();
  public ChangeThread(String name,Data data){
    super(name);//线程名称
    this.data=data;
  }
  public void run(){
    try {
      for(int i=0;true;i++){
        data.change("No:"+i); //模拟的数据
        Thread.sleep(random.nextInt(1000)); //模拟去做别的事情
        data.save(); //明确的要求要保存
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}
package org.zhy.demo04;
public class Main {
  public static void main(String[] args) {
    Data data=new Data("data.txt", "我是默认内容"); //文件的名称及文件的默认内容
    new ChangeThread("ChangeThread", data).start(); //手动保存
    new SaveThread("SaveThread", data).start(); //自动保存
  }
}

运行结果:

什么时候使用Balking模式?

1、不需要刻意去执行的时候
2、不想等待警戒条件时
3、警戒条件只有一次成立时

更多java相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》

希望本文所述对大家java程序设计有所帮助。

时间: 2017-06-08

详解java 单例模式及方法总结

java设计模式--单例模式  单例设计模式 Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例设计模式的类的构造方法私有化(采用private修饰). (2) 在其内部产生该类的实例化对象,并将其封装成private static类型. (3) 定义一个静态方法返回该类的实例. /** * 方法一 * 单例模式的实现:饿汉式,线程安全 但效率比较低 */ pu

JAVA多线程并发下的单例模式应用

单例模式应该是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了,今天给大家分享一个我在开发过程中遇到的单例模式的应用. 首先我们先来看一下单例模式的定义: 一个类有且仅有一个实例,并且自行实例化向整个系统提供. 单例模式的要素: 1.私有的静态的实例对象 2.私有的构造函数(保证在该类外部,无法通过new的方式来创建对象实例) 3.公有的.静态的.访问该实例对象的方法 单例模式分为懒汉形和饿汉式 懒汉式: 应用刚启动的时候,并不创建实例,当外部调用该类的实例

java 单例模式和工厂模式实例详解

单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例. 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 饿汉式单例 public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return singleton; } } 懒

Java中Builder模式的实现详解

前言 本文主要给大家介绍了关于如何实现Builder模式,大家在构建大对象时,对象的属性比较多,我们可以采用一个构造器或者使用空的构造器构造,然后使用setter方法去设置.在使用者使用这些方法时,会很多冗长的构造器参数列表或者setter方法.我们可以使用Builder模式来简化大对象的构造,提高代码的简洁性,同时提高使用者的编码体验. 下面我们将介绍在Java8之前.使用极简代码利器Lombok.Java8之后的Builder模式. Pre Java8 我们先来看下在Java8之前的Buil

Java多线程中的单例模式两种实现方式

Java多线程中的单例模式 一.在多线程环境下创建单例 方式一: package com.ietree.multithread.sync; public class Singletion { private static class InnerSingletion { private static Singletion single = new Singletion(); } public static Singletion getInstance() { return InnerSinglet

java 迭代器模式实例详解

java 迭代器模式实例详解 今天来818设计模式中的迭代器模式,也是java中Stack,List,Set等接口以及数组这个数据结构都会使用的一种模式. 首先,为什么使用迭代器模式,目的就是通过一个通用的迭代方法,隐藏stack,list,set以及数组中不同的遍历细节.也就是说,我不想让那些调用我的遍历容器的方法的人知道我到底是怎么一个一个的获取这些元素的(stack的pop,list的get,数组的array[i]),我只想让他知道他能 通过一个迭代器Iterator或者通过一个for e

Java多线程下的单例模式参考

单例有多种的写法,本例是懒汉式单例的一种写法.在高并发环境下需要注意的是: 1.单例在并发访问并调用其相应的getInstance方法的时候也会造成创建多个实例对象,加锁是必要的. 2.使用synchronized是比较好的解决方案,优点是代码简洁,缺点是在抛出异常的时候不能处理维护使系统处于良好状态. 3.显示的lock设定是良好的解决方案. 使用lock的代码如下: package demo; import java.util.concurrent.locks.Lock; import ja

Java适配器模式定义与用法示例

本文实例讲述了Java适配器模式定义与用法.分享给大家供大家参考,具体如下: 将一个类的接口转换成客户想要的另一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 适配器一共包括3种角色 1.目标:目标是一个接口,该接口是客户想使用的接口 2.被适配者:被适配者是一个已存在的接口或抽象类,这个接口或抽象类需要适配 3.适配器:适配器是一个类,该类实现了目标接口并包含有被适配者的引用,即适配者的指着是对被适配者接口与目标进行适配 package org.zhy.adapte

Java代理模式详细解析

代理模式是我们比较常用的设计模式之一.其中新思想是为了提供额外的处理或者不同的操作而在实际对象与调用者之间插入一个代理对象.这些额外的操作通常需要与实际对象进行通信,代理模式一般涉及到的角色有: 抽象角色:声明真实对象和代理对象的共同接口: 代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 真实角色:代理角色所代表的真实对象,

Java责任链模式定义与用法分析

本文实例讲述了Java责任链模式定义与用法.分享给大家供大家参考,具体如下: 使很多对象都有处理请求的机会,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止 责任链模式主要包括以下几个角色 1.处理者:处理者是一个接口,负责规定具体处理者处理用户请求的方法以及具体处理者设置后继处理对象的方法 2.具体处理者:具体处理者是实现处理接口的类的实例,具体处理者通过调用处理接口规定的方法处理用户的请求,既在接到用户的请求后,处理者将调用接

Java单利模式与多线程总结归纳

概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer

java多线程之线程安全的单例模式

概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer

Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解

前言 前面的例子都是多个线程在做相同的操作,比如4个线程都对共享数据做tickets–操作.大多情况下,程序中需要不同的线程做不同的事,比如一个线程对共享变量做tickets++操作,另一个线程对共享变量做tickets–操作,这就是大名鼎鼎的生产者和消费者模式. 正文 一,生产者-消费者模式也是多线程 生产者和消费者模式也是多线程的范例.所以其编程需要遵循多线程的规矩. 首先,既然是多线程,就必然要使用同步.上回说到,synchronized关键字在修饰函数的时候,使用的是"this"

学习Java多线程之线程定义、状态和属性

一 .线程和进程 1. 什么是线程和进程的区别: 线程是指程序在执行过程中,能够执行程序代码的一个执行单元.在java语言中,线程有四种状态:运行 .就绪.挂起和结束. 进程是指一段正在执行的程序.而线程有事也被成为轻量级的进程,他得程序执行的最小单元,一个进程可以拥有多个线程,各个线程之间共享程序的内功空间(代码段.数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程都拥有自己的棧空间. 2. 为何要使用多进程 在操作系统级别上来看主要有以下几个方面: - 使用多线程可以减少程序

深入理解JAVA多线程之线程间的通信方式

一,介绍 本总结我对于JAVA多线程中线程之间的通信方式的理解,主要以代码结合文字的方式来讨论线程间的通信,故摘抄了书中的一些示例代码. 二,线程间的通信方式 ①同步 这里讲的同步是指多个线程通过synchronized关键字这种方式来实现线程间的通信. 参考示例: public class MyObject { synchronized public void methodA() { //do something.... } synchronized public void methodB()

Java多线程中线程间的通信实例详解

Java多线程中线程间的通信 一.使用while方式来实现线程之间的通信 package com.ietree.multithread.sync; import java.util.ArrayList; import java.util.List; public class MyList { private volatile static List list = new ArrayList(); public void add() { list.add("apple"); } publ

java多线程之线程同步七种方式代码示例

为何要使用同步?  java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),     将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,     从而保证了该变量的唯一性和准确性. 1.同步方法  即有synchronized关键字修饰的方法.     由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,     内置锁会保护整个方法.在调用该方法前,需要获得内置锁,否则就处于阻塞状态.     代码

java多线程之线程,进程和Synchronized概念初解

一.进程与线程的概念 (1)在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单位都是进程. 在未配置 OS 的系统中,程序的执行方式是顺序执行,即必须在一个程序执行完后,才允许另一个程序执行:在多道程序环境下,则允许多个程序并发执行.程序的这两种执行方式间有着显著的不同.也正是程序并发执行时的这种特征,才导致了在操作系统中引入进程的概念. 自从在 20 世纪 60 年代人们提出了进程的概念后,在 OS 中一直都是以进程作为能拥有资源和独立运行的基本单位的.直到 20 世纪 8

Java多线程中线程的两种创建方式及比较代码示例

1.线程的概念:线程(thread)是指一个任务从头至尾的执行流,线程提供一个运行任务的机制,对于java而言,一个程序中可以并发的执行多个线程,这些线程可以在多处理器系统上同时运行.当程序作为一个应用程序运行时,java解释器为main()方法启动一个线程. 2.并行与并发: (1)并发:在单处理器系统中,多个线程共享CPU时间,而操作系统负责调度及分配资源给它们. (2)并行:在多处理器系统中,多个处理器可以同时运行多个线程,这些线程在同一时间可以同时运行,而不同于并发,只能多个线程共享CP

Java多线程及线程安全实现方法解析

一.java多线程实现的两种方式 1.继承Thread /** * * @version: 1.1.0 * @Description: 多线程 * @author: wsq * @date: 2020年6月8日下午2:25:33 */ public class MyThread extends Thread{ @Override public void run() { System.out.println("This is the first thread!"); } public s

java多线程中线程封闭详解

线程封闭的概念 访问共享变量时,通常要使用同步,所以避免使用同步的方法就是减少共享数据的使用,这种技术就是线程封闭. 实现线程封闭的方法 1:ad-hoc线程封闭 这是完全靠实现者控制的线程封闭,他的线程封闭完全靠实现者实现.也是最糟糕的一种线程封闭.所以我们直接把他忽略掉吧. 2:栈封闭 栈封闭是我们编程当中遇到的最多的线程封闭.什么是栈封闭呢?简单的说就是局部变量.多个线程访问一个方法,此方法中的局部变量都会被拷贝一分儿到线程栈中.所以局部变量是不被多个线程所共享的,也就不会出现并发问题.所