进程:进程指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能。
线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。
简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程
例一:
需求说明:张三和妻子各拥有一张银行卡和存折,可以对同一个银行账户进行存取款的操作,请使用多线程及同步方法模拟张三和妻子同时取款的过程。要求使用同步方法和同步代码块两种方式实现
分析:定义Account类表示银行帐户 定义两个线程分别实现张三和妻子取款的操作
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();
}
}
例二:模拟多人徒步爬山
使用多线程模拟多人徒步爬山
训练要点
使用任意一种方式创建线程
使用Thread.sleep()方法
设置线程休眠
需求说明
每个线程代表一个人
可设置每人爬山速度
每爬完100米显示信息
爬到终点时给出相应提示
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();
}
}