zl程序教程

您现在的位置是:首页 >  Java

当前栏目

java多线程实例程序实现与思想

2023-03-31 10:46:23 时间

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