Java多线程编程综合案例详解

目录
  • Java多线程综合案例
    • 数字加减
    • 生产电脑
    • 竞争抢答

Java多线程综合案例

数字加减

设计4个线程对象,两个线程执行减操作,两个线程执行加操作

public class ThreadDemo{
    public static void main(String[] args) throws Exception {
        Resource res=new Resource();
        AddThread at=new AddThread(res);
        SubThread st=new SubThread(res);
        new Thread(at,"加法线程A:").start();
        new Thread(at,"加法线程B:").start();
        new Thread(st,"减法线程X:").start();
        new Thread(st,"减法线程Y:").start();

    }
}
class AddThread implements Runnable{//加法操作
    private Resource resource;
    public AddThread(Resource resource) {
        this.resource=resource;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int x=0;x<50;x++) {
            try {
                this.resource.add();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
class SubThread implements Runnable{//减法操作
    private Resource resource;
    public SubThread(Resource resource) {
        this.resource=resource;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int x=0;x<50;x++) {
            try {
                this.resource.sub();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
class Resource{//定义一个操作的资源
    private int num=0;//这个要进行加减操作的数据
    private boolean flag=true;//加减的切换
    //flag=true;表示可以进行加法操作,但无法进行减法操作
    //flag=false;表示可以进行减法操作,但是无法进行加法操作
    public synchronized void add() throws Exception {//执行加法操作
        if(this.flag==false) {//线程需要执行的是减法操作,加法操作要等待处理
            super.wait();
        }
        Thread.sleep(100);
        this.num++;
        System.out.println("加法操作-"+Thread.currentThread().getName()+"num="+this.num);
        this.flag=false;//加法操作执行完毕,需要执行减法处理
        super.notifyAll();//唤醒全部等待处理
    }
    public synchronized void sub() throws Exception {//执行减法操作
        if(this.flag==true) {//线程需要执行的是加法操作,减法操作要等待处理
            super.wait();
        }
        Thread.sleep(200);
        this.num--;
        System.out.println("减法操作-"+Thread.currentThread().getName()+"num="+this.num);
        this.flag=true;//减法操作执行完毕,现在要执行加法操作
        super.notifyAll();//唤醒全部等待线程
    }
}

这一题目是经典的多线程开发操作,这个程序里面一定要考虑的核心本质在于:加一个、减一个,整体的计算结果应该只在0、-1、1之间循环出现

生产电脑

设计一个生产电脑和搬运电脑的类,要求生产一台电脑就搬走一台电脑,如果没有新电脑的生产就等待新电脑生产;如果生产出的电脑没有搬走,则要等待电脑搬走之后再生产,并统计出电脑生产的数量

解答:在本程序之中实现的就是一个标准的生产者与消费者的处理模型

public class ThreadDemo{
    public static void main(String[] args) throws Exception {

        Resource res=new Resource();
        new Thread(new Producer(res)).start();
        new Thread(new Consumer(res)).start();

    }
}
class Producer implements Runnable{
    private Resource resource;
    public Producer(Resource resource) {
        this.resource=resource;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int x=0;x<50;x++) {

            this.resource.make();
        }

    }

}
class Consumer implements Runnable{
    private Resource resource;
    public Consumer(Resource resource) {
        this.resource=resource;
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        for(int x=0;x<50;x++) {

            this.resource.get();
        }

    }

}
class Resource{
    private Computer computer;
    private boolean flag=true;
    public synchronized void make() {
        if(this.computer!=null) {//已经生产过了
            try {
                super.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        this.computer=new Computer("小米电脑",1.1);
        System.out.println("生产电脑"+this.computer);
        super.notifyAll();
    }
    public synchronized void get() {
        if(this.computer==null) {//还没有生产
            try {
                super.wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("取走电脑"+this.computer);
        this.computer=null;//已经取走了
        super.notifyAll();
    }
}
class Computer{
    private static int count=0;//表示生产个数
    private String name;
    private double price;
    public Computer(String name,double price) {
        this.name=name;
        this.price=price;
        count++;
    }
    public String toString(){
        return "第"+count +"台电脑"+"电脑名字:"+this.name+"、价值:"+this.price;
    }
}

竞争抢答

实现一个竞拍抢答程序:要求设置三个抢答者(三个线程),而后发出抢答指令,抢答成功给出抢答成功提示,抢答失败给出抢答失败提示

由于需要牵扯到数据的返回所以使用Callable更简单

package java线程;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class ThreadDemo{
	public static void main(String[] args) throws Exception {

		Mythread mt=new Mythread();
		FutureTask<String> taskA=new FutureTask<String>(mt);
		FutureTask<String> taskB=new FutureTask<String>(mt);
		FutureTask<String> taskC=new FutureTask<String>(mt);
		new Thread(taskA,"竞赛者A").start();
		new Thread(taskB,"竞赛者B").start();
		new Thread(taskC,"竞赛者C").start();
		System.out.println(taskA.get());
		System.out.println(taskB.get());
		System.out.println(taskC.get());

	}
}
class Mythread implements Callable<String>{
	private boolean flag=false;

	@Override
	public String call() throws Exception {
		// TODO Auto-generated method stub
		synchronized (this) {
			if(this.flag==false) {
				this.flag=true;
				return Thread.currentThread().getName()+"抢答成功";
			}
			else {
				return Thread.currentThread().getName()+"抢答失败";
			}

		}
	}

}

使用Callable的主要原因是因为Callable拥有返回值方便我们处理

到此这篇关于Java多线程编程综合案例详解的文章就介绍到这了,更多相关Java多线程编程内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java进阶必备之多线程编程

    一.图示 二.多线程编程 何为多线程,通俗的讲就是让你的代码同时干好几件事. 而我们的一个代码文件或者一个项目就是一个进程,而如果我们想提高效率,我们可以多开几个文件进行多进程,也可以在进程中创建多线程(多写几个方法),但是多进程比较耗费资源,所以一般推荐多线程,在代码里,让代码做几个文件做的事. 多线程编程可以让我们的代码拥有更高效率. 三.线程的工作过程 犹如上图 使用多线程需要先创建一个或者多个线程 然后让线程调用CPU资源,开始运行 然后运行完毕等待所有线程运行完毕 然后删除资源,结束线

  • 实例总结Java多线程编程的方法

    1.什么时候使用多线程编程 一个任务在正常情况下是按顺序执行的,但是如果当前任务里有多个相似进程块(例如for,while语句),我们就可以考虑把这些代码块抽出来并行运行,无需阻塞 2.实现多线程的几种方式 一种是继承Thread类重写run方法,另一种是实现Runnable接口重写run方法 启动多线程很多情况下是为了处理并发进程,此时对于部分实时性要求不是那么高的业务需求,我们还可以通过实现队列的方式,异步实现. 3.举例 继承Thread /** * * @ClassName: Threa

  • 浅谈java多线程编程

    一.多线程的优缺点 多线程的优点: 1)资源利用率更好 2)程序设计在某些情况下更简单 3)程序响应更快 多线程的代价: 1)设计更复杂 虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂.在多线程访问共享数据的时候,这部分代码需要特别的注意.线程之间的交互往往非常复杂.不正确的线程同步产生的错误非常难以被发现,并且重现以修复. 2)上下文切换的开销 当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另一个线程的本地数据

  • Java学习随记之多线程编程

    Process和Thread 程序是指令和数据的有序集合, 本身没有运行的含义,是一个静态的概念. 进程是执行程序的一次执行过程,他是一个动态的概念,是系统资源分配的单位 一个进程中可以包含若干个线程,线程是CPU调度和执行的单位 线程创建 三种创建方法 继承Thread类 //创建线程方法一:继承Thread类,重写run() 方法,调用start开启主线程 public class TestThread01 extends Thread{ @Override public void run(

  • JAVA多线程编程实例详解

    本文实例讲述了JAVA多线程编程.分享给大家供大家参考,具体如下: 进程是系统进行资源调度和分配的一个独立单位. 进程的特点 独立性:进程是系统中独立存在的实体,拥有自己的独立资源和私有空间.在没有经过进程本身允许的情况下,不能直接访问其他进程. 动态性:进程与程序的区别在于,前者是一个正在系统中活动的指令,而后者仅仅是一个静态的指令集合 并发性:多个进程可以在单个处理器上并发执行,而不受影响. 并发性和并行性的区别: 并行性:在同一时刻,有多条指令在多个处理器上同时执行(多个CPU) 并发性:

  • Java多线程编程详细解释

    目录 一.多线程的优缺点 多线程的优点: 多线程的代价: 二.创建java多线程 1.创建Thread的子类 2.实现Runnable接口 三.线程安全 四.java同步块 五.java线程通信 六.java中的锁 七.java中其他同步方法 八.java中的线程池 参考: 总结 一.多线程的优缺点 多线程的优点: 1)资源利用率更好 2)程序设计在某些情况下更简单 3)程序响应更快 多线程的代价: 1)设计更复杂 虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂.在多线程

  • Java多线程编程综合案例详解

    目录 Java多线程综合案例 数字加减 生产电脑 竞争抢答 Java多线程综合案例 数字加减 设计4个线程对象,两个线程执行减操作,两个线程执行加操作 public class ThreadDemo{ public static void main(String[] args) throws Exception { Resource res=new Resource(); AddThread at=new AddThread(res); SubThread st=new SubThread(re

  • Java aop面向切面编程(aspectJweaver)案例详解

    面向切面编程的目的就是:在不改变别人的代码的前提下,在别人代码方法执行前或后,执行(切入自己的逻辑) 准备:idea+maven+aspectjweaver-1.8.9.jar 结构图: pom.xml内容 <dependencies> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.8.9&

  • Java并发之Condition案例详解

    目录 一.Condition接口介绍和示例 二.Condition接口常用方法 三.Condition接口原理简单解析 3.1.等待 3.2.通知 四.总结 五.利用Condition实现生产者消费者模式 在使用Lock之前,我们使用的最多的同步方式应该是synchronized关键字来实现同步方式了.配合Object的wait().notify()系列方法可以实现等待/通知模式.Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方

  • Java并发编程-volatile可见性详解

    前言 要学习好Java的多线程,就一定得对volatile关键字的作用机制了熟于胸.最近博主看了大量关于volatile的相关博客,对其有了一点初步的理解和认识,下面通过自己的话叙述整理一遍. 有什么用? volatile主要对所修饰的变量提供两个功能 可见性 防止指令重排序 <br>本篇博客主要对volatile可见性进行探讨,以后发表关于指令重排序的博文. 什么是可见性? 把JAVA内存模型(JMM)展示得很详细了,简单概括一下 1.每个Thread有一个属于自己的工作内存(可以理解为每个

  • Java SpringBoot Validation用法案例详解

    目录 constraints分类 对象集成constraints示例 SpringBoot集成自动验证 集成maven依赖 验证RequestBody.Form对象参数 验证简单参数 验证指定分组 全局controller验证异常处理 自定义constraints @DateFormat @PhoneNo 使用自定义constraint注解 问题 提到输入参数的基本验证(非空.长度.大小.格式-),在以前我们还是通过手写代码,各种if.else.StringUtils.isEmpty.Colle

  • java多线程JUC常用辅助类详解

    1.countDownLatch 减法计数器:实现调用几次线程后,在触发另一个任务 简单代码实现: 举例说明:就像五个人在同一房间里,有一个看门的大爷,当五个人都出去后,他才能锁门,也就是说 执行5次出门这个动作的线程后,才出发了锁门的这个动作 import java.util.concurrent.CountDownLatch; /** * @program: juc * @description * @author: 不会编程的派大星 * @create: 2021-04-24 16:55

  • Java ConcurrentModificationException异常解决案例详解

    Java ConcurrentModificationException异常原因和解决方法 在前面一篇文章中提到,对Vector.ArrayList在迭代的时候如果同时对其进行修改就会抛出java.util.ConcurrentModificationException异常.下面我们就来讨论以下这个异常出现的原因以及解决办法. 以下是本文目录大纲: 一.ConcurrentModificationException异常出现的原因 二.在单线程环境下的解决办法 三.在多线程环境下的解决方法 一.C

  • Java并发编程ThreadLocalRandom类详解

    目录 为什么需要ThreadLocalRandom ThreadRandom原理详解 为什么需要ThreadLocalRandom java.util.Random一直都是使用比较广泛的随机数生成工具类,而且java.lang.Math中的随机数生成也是使用的java.util.Random实例. 我们下面看一下java.util.Random的使用方法: import java.util.Random; public class code_4_threadRandom { public sta

  • Java多线程用法的实例详解

    Java多线程用法的实例详解 前言: 最全面的java多线程用法解析,如果你对Java的多线程机制并没有深入的研究,那么本文可以帮助你更透彻地理解Java多线程的原理以及使用方法. 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口.在使用Runnable接口时需要建立一个Thread实例.因此,无论是通过Thread类还是Runnable接口建立线程,都必须建立Thread类或它的子类的实例.Thread构造函数: public Thread( ); p

  • Java多线程通信实现方式详解

    这篇文章主要介绍了Java多线程通信实现方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 线程通信的方式: 1.共享变量 线程间通信可以通过发送信号,发送信号的一个简单方式是在共享对象的变量里设置信号值.线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步代码块里读取hasDataToProcess这个成员变量.这个简单的例子使用了一个持有信号的对象,并提供了set和get方法. pu

随机推荐