JAVA 之 多线程 银行存款

多线程学习示例代码

  • 解决高并发

  • 数据同步


Java线程具有五中基本状态

  • 新建状态(New):当线程对象对创建后,即进入了新建状态,如:Thread t = new MyThread();
  • 就绪状态(Runnable):当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行;
  • 运行状态(Running):当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就 绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中;
  • 阻塞状态(Blocked):处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态。根据阻塞产生的原因不同,阻塞状态又可以分为三种:

1.等待阻塞:运行状态中的线程执行wait()方法,使本线程进入到等待阻塞状态;

2.同步阻塞 -- 线程在获取synchronized同步锁失败(因为锁被其它线程所占用),它会进入同步阻塞状态;

3.其他阻塞 -- 通过调用线程的sleep()或join()或发出了I/O请求时,线程会进入到阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。

  • 死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

Bank.class

package com.mylzs.cn.sync_bank;

import java.util.Random;

/**
 * 私人银行
 * Created by Administrator on 17/11/9.
 */
public class Bank {
    private int sum;//总金额

    //存钱
    public void  add(int num){
        System.out.print(Thread.currentThread().getName()+"存入" + num+"  ");

        sum+=num;
        System.out.println("总数: "+sum);
    }
}


Save.class

package com.mylzs.cn.sync_bank;

import java.util.Random;

/**
 * 存钱操作
 * Created by Administrator on 17/11/9.
 */
public class Save implements Runnable {
    //找到对应的银行
private  Bank bank=new Bank();

//存钱操作
    public    void saveMoney(){

        for (int i = 0; i < 100; i++) {
                  try {
                Thread.sleep(new Random().nextInt(10)*10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized(this){ bank.add(100);}


        }

    }
    @Override
    public void run() {
        saveMoney();
    }
}

ATM.class

package com.mylzs.cn.sync_bank;

/**
 * Created by Administrator on 17/11/9.
 */
public class ATM {
    public static void main(String[] args) {
        Save save=new Save();
        //ATM机一号
        Thread thread1=new Thread(save);
        //ATM机二号
        Thread thread2=new Thread(save);
        //同时开始存钱
        thread1.start();
        thread2.start();
    }
}

存钱结果

D:\zscool\java_jdk\bin\java -Didea.launcher.port=7532 "-Didea.launcher.bin.path=D:\zscool\javaIDEA\IntelliJ IDEA 2016.3.4\bin" -Dfile.encoding=UTF-8 -classpath "D:\zscool\java_jdk\jre\lib\charsets.jar;D:\zscool\java_jdk\jre\lib\deploy.jar;D:\zscool\java_jdk\jre\lib\ext\access-bridge-64.jar;D:\zscool\java_jdk\jre\lib\ext\cldrdata.jar;D:\zscool\java_jdk\jre\lib\ext\dnsns.jar;D:\zscool\java_jdk\jre\lib\ext\jaccess.jar;D:\zscool\java_jdk\jre\lib\ext\jfxrt.jar;D:\zscool\java_jdk\jre\lib\ext\localedata.jar;D:\zscool\java_jdk\jre\lib\ext\nashorn.jar;D:\zscool\java_jdk\jre\lib\ext\sunec.jar;D:\zscool\java_jdk\jre\lib\ext\sunjce_provider.jar;D:\zscool\java_jdk\jre\lib\ext\sunmscapi.jar;D:\zscool\java_jdk\jre\lib\ext\sunpkcs11.jar;D:\zscool\java_jdk\jre\lib\ext\zipfs.jar;D:\zscool\java_jdk\jre\lib\javaws.jar;D:\zscool\java_jdk\jre\lib\jce.jar;D:\zscool\java_jdk\jre\lib\jfr.jar;D:\zscool\java_jdk\jre\lib\jfxswt.jar;D:\zscool\java_jdk\jre\lib\jsse.jar;D:\zscool\java_jdk\jre\lib\management-agent.jar;D:\zscool\java_jdk\jre\lib\plugin.jar;D:\zscool\java_jdk\jre\lib\resources.jar;D:\zscool\java_jdk\jre\lib\rt.jar;E:\JAVA-WEB\Untitled_Demo_Java\out\production\Untitled_Demo_Java;D:\zscool\javaIDEA\IntelliJ IDEA 2016.3.4\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.mylzs.cn.sync_bank.ATM
Thread-0存入100  总数: 100
Thread-1存入100  总数: 200
Thread-0存入100  总数: 300
Thread-1存入100  总数: 400
Thread-0存入100  总数: 500
Thread-0存入100  总数: 600
Thread-1存入100  总数: 700
Thread-1存入100  总数: 800
Thread-0存入100  总数: 900
Thread-0存入100  总数: 1000
Thread-1存入100  总数: 1100
Thread-0存入100  总数: 1200
Thread-1存入100  总数: 1300
Thread-0存入100  总数: 1400
Thread-0存入100  总数: 1500
Thread-1存入100  总数: 1600
Thread-0存入100  总数: 1700
Thread-0存入100  总数: 1800
Thread-1存入100  总数: 1900
Thread-0存入100  总数: 2000
Thread-1存入100  总数: 2100
Thread-0存入100  总数: 2200
Thread-1存入100  总数: 2300
Thread-0存入100  总数: 2400
Thread-1存入100  总数: 2500
Thread-1存入100  总数: 2600
Thread-0存入100  总数: 2700
Thread-1存入100  总数: 2800
Thread-0存入100  总数: 2900
Thread-1存入100  总数: 3000
Thread-0存入100  总数: 3100
Thread-0存入100  总数: 3200
Thread-0存入100  总数: 3300
Thread-1存入100  总数: 3400
Thread-0存入100  总数: 3500
Thread-1存入100  总数: 3600
Thread-0存入100  总数: 3700
Thread-1存入100  总数: 3800
Thread-0存入100  总数: 3900
Thread-1存入100  总数: 4000
Thread-0存入100  总数: 4100
Thread-0存入100  总数: 4200
Thread-0存入100  总数: 4300
Thread-1存入100  总数: 4400
Thread-1存入100  总数: 4500
Thread-0存入100  总数: 4600
Thread-1存入100  总数: 4700
Thread-0存入100  总数: 4800
Thread-1存入100  总数: 4900
Thread-0存入100  总数: 5000
Thread-1存入100  总数: 5100
Thread-0存入100  总数: 5200
Thread-0存入100  总数: 5300
Thread-1存入100  总数: 5400
Thread-0存入100  总数: 5500
Thread-1存入100  总数: 5600
Thread-1存入100  总数: 5700
Thread-0存入100  总数: 5800
Thread-1存入100  总数: 5900
Thread-0存入100  总数: 6000
Thread-0存入100  总数: 6100
Thread-1存入100  总数: 6200
Thread-0存入100  总数: 6300
Thread-1存入100  总数: 6400
Thread-0存入100  总数: 6500
Thread-0存入100  总数: 6600
Thread-0存入100  总数: 6700
Thread-1存入100  总数: 6800
Thread-0存入100  总数: 6900
Thread-0存入100  总数: 7000
Thread-1存入100  总数: 7100
Thread-0存入100  总数: 7200
Thread-1存入100  总数: 7300
Thread-0存入100  总数: 7400
Thread-0存入100  总数: 7500
Thread-1存入100  总数: 7600
Thread-1存入100  总数: 7700
Thread-0存入100  总数: 7800
Thread-0存入100  总数: 7900
Thread-0存入100  总数: 8000
Thread-1存入100  总数: 8100
Thread-1存入100  总数: 8200
Thread-0存入100  总数: 8300
Thread-0存入100  总数: 8400
Thread-1存入100  总数: 8500
Thread-0存入100  总数: 8600
Thread-0存入100  总数: 8700
Thread-1存入100  总数: 8800
Thread-1存入100  总数: 8900
Thread-0存入100  总数: 9000
Thread-1存入100  总数: 9100
Thread-1存入100  总数: 9200
Thread-1存入100  总数: 9300
Thread-0存入100  总数: 9400
Thread-0存入100  总数: 9500
Thread-1存入100  总数: 9600
Thread-1存入100  总数: 9700
Thread-0存入100  总数: 9800
Thread-1存入100  总数: 9900
Thread-1存入100  总数: 10000
Thread-0存入100  总数: 10100
Thread-1存入100  总数: 10200
Thread-0存入100  总数: 10300
Thread-1存入100  总数: 10400
Thread-0存入100  总数: 10500
Thread-0存入100  总数: 10600
Thread-1存入100  总数: 10700
Thread-0存入100  总数: 10800
Thread-0存入100  总数: 10900
Thread-1存入100  总数: 11000
Thread-1存入100  总数: 11100
Thread-1存入100  总数: 11200
Thread-0存入100  总数: 11300
Thread-0存入100  总数: 11400
Thread-1存入100  总数: 11500
Thread-0存入100  总数: 11600
Thread-1存入100  总数: 11700
Thread-1存入100  总数: 11800
Thread-1存入100  总数: 11900
Thread-0存入100  总数: 12000
Thread-1存入100  总数: 12100
Thread-1存入100  总数: 12200
Thread-1存入100  总数: 12300
Thread-0存入100  总数: 12400
Thread-0存入100  总数: 12500
Thread-0存入100  总数: 12600
Thread-1存入100  总数: 12700
Thread-1存入100  总数: 12800
Thread-1存入100  总数: 12900
Thread-1存入100  总数: 13000
Thread-0存入100  总数: 13100
Thread-1存入100  总数: 13200
Thread-0存入100  总数: 13300
Thread-1存入100  总数: 13400
Thread-0存入100  总数: 13500
Thread-1存入100  总数: 13600
Thread-0存入100  总数: 13700
Thread-0存入100  总数: 13800
Thread-1存入100  总数: 13900
Thread-1存入100  总数: 14000
Thread-0存入100  总数: 14100
Thread-1存入100  总数: 14200
Thread-0存入100  总数: 14300
Thread-1存入100  总数: 14400
Thread-0存入100  总数: 14500
Thread-1存入100  总数: 14600
Thread-0存入100  总数: 14700
Thread-1存入100  总数: 14800
Thread-0存入100  总数: 14900
Thread-0存入100  总数: 15000
Thread-0存入100  总数: 15100
Thread-0存入100  总数: 15200
Thread-1存入100  总数: 15300
Thread-0存入100  总数: 15400
Thread-0存入100  总数: 15500
Thread-1存入100  总数: 15600
Thread-0存入100  总数: 15700
Thread-1存入100  总数: 15800
Thread-0存入100  总数: 15900
Thread-1存入100  总数: 16000
Thread-1存入100  总数: 16100
Thread-1存入100  总数: 16200
Thread-0存入100  总数: 16300
Thread-0存入100  总数: 16400
Thread-0存入100  总数: 16500
Thread-1存入100  总数: 16600
Thread-1存入100  总数: 16700
Thread-1存入100  总数: 16800
Thread-0存入100  总数: 16900
Thread-1存入100  总数: 17000
Thread-0存入100  总数: 17100
Thread-0存入100  总数: 17200
Thread-0存入100  总数: 17300
Thread-1存入100  总数: 17400
Thread-0存入100  总数: 17500
Thread-1存入100  总数: 17600
Thread-1存入100  总数: 17700
Thread-0存入100  总数: 17800
Thread-1存入100  总数: 17900
Thread-0存入100  总数: 18000
Thread-0存入100  总数: 18100
Thread-1存入100  总数: 18200
Thread-1存入100  总数: 18300
Thread-0存入100  总数: 18400
Thread-1存入100  总数: 18500
Thread-0存入100  总数: 18600
Thread-0存入100  总数: 18700
Thread-1存入100  总数: 18800
Thread-0存入100  总数: 18900
Thread-1存入100  总数: 19000
Thread-0存入100  总数: 19100
Thread-1存入100  总数: 19200
Thread-1存入100  总数: 19300
Thread-1存入100  总数: 19400
Thread-1存入100  总数: 19500
Thread-1存入100  总数: 19600
Thread-1存入100  总数: 19700
Thread-1存入100  总数: 19800
Thread-1存入100  总数: 19900
Thread-1存入100  总数: 20000

Process finished with exit code 0


欢迎加群技术交流234731686

推荐阅读更多精彩内容