写程序之前要了解两个概念

1.什么是进程

2.什么是线程

搞清楚这两个概念之后 才能写好一个合适而不会太抽象的程序

对进程和线程的理解见链接:

https://blog.csdn.net/new_teacher/article/details/51469241

https://www.cnblogs.com/aaronthon/p/9824396.html

那么理解了概念之后 如何写程序?

以银行取钱为例:

两个人有一个相同的账户->这个账户存储在银行->去银行取钱

个人理解:

银行是进程 客户是线程 取钱这个动作是基于客户所拥有的账户来实现的

在此参考了以下代码:

https://blog.csdn.net/u010988549/article/details/79158121

实现:

public class Bank {
String ACname;
double money;
public synchronized void withdraw(double getMoney)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setMoney(this.getMoney()-getMoney);
System.out.println(Thread.currentThread().getName()+" 取出"+getMoney+"元,当前余额为: "+this.getMoney()+" 元");
}
}
public class Person implements Runnable{
Bank bank; public Person(Bank bank) {
this.bank = bank;
} @Override
public void run() {
this.bank.withdraw(1000);
}
}

我的心得见注释:

public static void main(String[] args){
Bank bank1=new Bank("frank",10000);//作为进程 有一块共享资源
Person person=new Person(bank1);//通过共享资源来建立共享对象 通过共享对象来建立线程
//线程通过对象来使用资源 从而建立run方法
Thread t1=new Thread(person,"father");
Thread t2=new Thread(person,"son");
t1.start();
t2.start();
}

同样道理:

以窗口售票为例:

车站有共同的车票->车站有不同的窗口来售票

车站是进程 车票是共享资源 不同的窗口是线程

而窗口共有的是什么呢 是票对吧 票在哪 在车站

代码如下:

public class Station {
int tickets; public synchronized void sell(int buyTickets)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(this.getTickets()>0)
{
this.setTickets(this.getTickets()-buyTickets);
System.out.println(Thread.currentThread().getName() + ":卖票,票号为:" + this.getTickets());
}
}
}
public class SaleWindows implements Runnable {
Station station;
int number; @Override
public void run() {
station.sell(1);
}
}
public static void main(String[] args){
Station station=new Station(10);
SaleWindows window1=new SaleWindows(station,1);//不同窗口
SaleWindows window2=new SaleWindows(station,2);
Thread t1=new Thread(window1,String.valueOf(window1.getNumber()));
Thread t2=new Thread(window2,String.valueOf(window2.getNumber()));
t1.start();
t2.start();
}
以上为写程序的一点感悟

java多线程实例程序实现与思想的更多相关文章

  1. Java多线程-实例解析

    Java多线程实例 3种实现方法Java中的多线程有三种实现方式:1.继承Thread类,重写run方法.Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯 ...

  2. java多线程实例

    import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; import java.util.concurr ...

  3. java多线程实例(2)

    public class ThreadDemo05 { public static void main(String args[]) { // 四个售票点应该控制同一个资源 Demo d = new ...

  4. java 多线程总结篇4——锁机制

    在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制.Java提供了多种多线程锁机制的实现方式,常见的有synchronized.ReentrantLock.Semaphore. ...

  5. JAVA多线程之生产者 消费者模式 妈妈做面包案例

    创建四个类 1.面包类 锅里只可以放10个面包 ---装面包的容器2.厨房 kitchen 生产面包 和消费面包  最多生产100个面包3.生产者4消费者5.测试类 多线程经典案例 import ja ...

  6. JAVA之旅(十二)——Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口

    JAVA之旅(十二)--Thread,run和start的特点,线程运行状态,获取线程对象和名称,多线程实例演示,使用Runnable接口 开始挑战一些难度了,线程和I/O方面的操作了,继续坚持 一. ...

  7. java Socket多线程聊天程序

    参考JAVA 通过 Socket 实现 TCP 编程 参考java Socket多线程聊天程序(适合初学者) 以J2SDK-1.3为例,Socket和ServerSocket类库位于java.net包 ...

  8. 用Java实现多线程服务器程序

    一.Java中的服务器程序与多线程 在Java之前,没有一种主流编程语言能够提供对高级网络编程的固有支持.在其他语言环境中,实现网络程序往往需要深入依赖于操作平台的网络API的技术中去,而Java提供 ...

  9. java多线程编程实例

    [转]这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下. 1.三个售票窗口同时出售20张票程序分析:   ...

随机推荐

  1. Linux 安装Apche服务

    用yum 进行在线安装apche服务 yum install -y httpd 我这边是centos7 需要开启一下端口: 1 firewall-cmd --zone=public --add-por ...

  2. Node.js精进(8)——错误处理

    在 Node.js 中,提供了 error 模块,并且内置了标准的 JavaScript 错误,常见的有: EvalError:在调用 eval() 函数时出现问题时抛出该错误. SyntaxErro ...

  3. resultMap自定义映射(一对多)

    collection:处理一对多和多对多的关系 1) POJO中的属性可能会是一个集合对象,我们可以使用联合查询,并以级联属性的方式封装对象.使用collection标签定义对象的封装规则 publi ...

  4. LDAP+Gitea统一认证Git服务器账户管理openLdap和微软的ad

    很多时候我们需要管理多个内容管理系统,比如Jira.Jenkins.GitEA/Gitlab等等各种管理系统,我们需要每一套管理系统每个人都管理一套密码,每套系统每套密码简直是一种灾难,于是LDAP可 ...

  5. Note -「序列元素在线段树上的深度」 感悟

    0x01 前言 想法源于一道你谷的毒瘤题目. 这个方面的知识点好像挺新颖的. 于是和 JC 一起想出了该命题的 \(O(n)\) 解法. 0x02 算法本身 总所周知,线段树上的节点都对应表示的原序列 ...

  6. docker部署练习

    三个部署任务 docker部署nginx docker pull nginx #拉取nginx镜像 docker images #检查拉取的镜像 docker run -d -p 3344:80 -- ...

  7. CentOS删除桌面环境

    公司有几台虚拟机安装的是CentOS7的桌面环境,平时也是用终端访问,于是在服务器卡住需要重启时,顺便就把桌面环境给卸载了:测试了好多方法均不成功,最终找到了可行的方式,以此记录: [root@yun ...

  8. python base64编码和解码图片

    简介 在实际项目中,可能需要对图片进行大小的压缩,较为常见的方法则是将图片转换为base64的编码,本文就python编码和解码图片做出一定的介绍. 代码 import base64 import o ...

  9. Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单。

    前方: 开源地址:https://github.com/cyq1162/Taurus.MVC 上篇文章介绍过:工业制造行业的低代码开发平台思维架构图 规划中涉及到了微服务,近些天经过努力和不断的代码与 ...

  10. Linux系列之链接

    前言 在类Unix系统中,一个文件有可能被多个名字引用.我们使用链接来实现这一点,链接共有两种类型:硬链接和软链接,本文分别来介绍它们. 硬链接 硬链接也允许指向文件,但与符号链接的方式不同.它们是U ...