写程序之前要了解两个概念
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();   }    
以上为写程序的一点感悟