第三章JAVA高级特性多线程

  1. 多线程介绍

学习多线程之前,我们先要了解几个关于多线程有关的概念。

进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。

线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。

简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程

例一:

需求说明:张三和妻子各拥有一张银行卡和存折,可以对同一个银行账户进行存取款的操作,请使用多线程及同步方法模拟张三和妻子同时取款的过程。要求使用同步方法和同步代码块两种方式实现

分析:定义Account类表示银行帐户      定义两个线程分别实现张三和妻子取款的操作

第三章JAVA高级特性多线程_第1张图片

package com.vp.day06.demo01;


public class Bank implements Runnable {
    int money = 500;


    @Override
    public void run() {
        while (true) {
            if (money == 0) {
                break;
            }
            sale();
        }
    }

    public synchronized void sale() {

        if (money > 0) {
            System.out.println(Thread.currentThread().getName() + "准备取款!");
            System.out.println(Thread.currentThread().getName() + "取款完毕!");
            money -= 100;
            try {
                Thread.sleep(500);
            } catch (Exception e) {
            }
        } else {
            for (int i = 0; i < 5; i++) {
                System.out.println("余额不足以支付" + Thread.currentThread().getName() + "的取款,余额为0");
            }
        }
    }



    private int money = 500; // 存款500
    private int num = 0; // 存款不足的次数
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) { // 取款5次
            synchronized (this) {
                if (num >= 5) {
                    break;
                }
                if (money > 0) { // 存款够的时候
                    System.out.println(Thread.currentThread().getName() + "准备取款");
                    System.out.println(Thread.currentThread().getName() + "完成取款");

                } else if (money <= 0) { // 存款不足时
                    num++;
                    System.out.println("余额不足以支付" + Thread.currentThread().getName() + "的取款,余额为0");
                }
                money -= 100;
                try {
                    Thread.sleep(500); // 模拟取款时间
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
package com.vp.day06.demo01;

import com.vp.day06.demo02.MyRunnablethree;

/**
 * 张三和妻子各拥有一张银行卡和存折,可以对同一个银行账户进行存取款的操作,请使用多线程及同步方法模拟张三和妻子同时取款的过程。
 * 要求使用同步方法和同步代码块两种方式实现
 分析
 定义Account类表示银行帐户
 定义两个线程分别实现张三和妻子取款的操作
 */
public class Test {
    public static void main(String[] args) {
        Bank bank =new Bank();
        Thread thread=new Thread( bank,"张三" );
        Thread thread1=new Thread( bank,"张三的妻子" );
        thread.start();
        thread1.start();
    }
}

例二:模拟多人徒步爬山

使用多线程模拟多人徒步爬山

训练要点

  1. 使用任意一种方式创建线程 
  2. 使用Thread.sleep()方法 

设置线程休眠 

需求说明

  1. 每个线程代表一个人 
  2. 可设置每人爬山速度 
  3. 每爬完100米显示信息 
  4. 爬到终点时给出相应提示 

第三章JAVA高级特性多线程_第2张图片

package com.vp.day06.demo02;

/**
 *使用多线程模拟多人徒步爬山
 训练要点
 使用任意一种方式创建线程
 使用Thread.sleep()方法
 设置线程休眠
 需求说明
 每个线程代表一个人
 可设置每人爬山速度
 每爬完100米显示信息
 爬到终点时给出相应提示

 */
public class MyRunnablethree extends Thread{
    private int time;
    public int num=0;

    public MyRunnablethree(String name, int time,int kio) {
        super(name);
        this.time = time;
        this.num=kio*1000/100;
    }

    @Override
    public void run() {
        while (num>0){
            try {
                Thread.sleep(this.time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(Thread.currentThread().getName()+"爬完100米!");
            num--;
        }
        System.out.println(Thread.currentThread().getName()+"到达终点!");
    }
}
package com.vp.day06.demo02;

/**
 * 模拟多人徒步爬山
 使用多线程模拟多人徒步爬山
 训练要点
 使用任意一种方式创建线程
 使用Thread.sleep()方法
 设置线程休眠
 需求说明
 每个线程代表一个人
 可设置每人爬山速度
 每爬完100米显示信息
 爬到终点时给出相应提示
 */

public class Test {
    public static void main(String[] args) {
        MyRunnablethree aged=new MyRunnablethree("老年人",1500,1);
        MyRunnablethree youngPeopl=new MyRunnablethree("年轻人",500,1);
        System.out.println("********开始爬山********");
        aged.start();
        youngPeopl.start();
    }
}

 

你可能感兴趣的:(第三章JAVA高级特性多线程)