启动线程的两个步骤:
1.实现Runnable这个接口,并实现这个接口中的run()方法。
2.实例化一个Thread对象并把实现了Runnable的对象传入Thread的构造参数中。
对Runnable和Thread的初步理解:
实现了接口Runnable中的run方法的对象就像是一份被指定的工作。而Thread就像是一个等待接收工作的工人。因此把实现了接口Runnable中的run方法的对象传入Thread()时就相当于给一个工人指定了工作。而这个被指定了工作的工人也就相当于一份可执行的线程。
以下列排队买票为例:
题目:模拟三个人排队买票,张某、李某和赵某买电影票,售票员只有三张五元的钱,电影票5元钱一张。张某拿二十元一张的新人民币排在李的前面买票,李某排在赵的前面拿一张10元的人民币买票,赵某拿一张五元的人民币买票。
简单思路:售票员为一个对象,负责找零和通知顾客排队。三个顾客各为一个对象,负责携带个人信息向售票员买票。其中要注意的是售票员对象只有一个(因为三个顾客均向该售票员买票),因此要实例化一个售票员对象并传入buyTickets()。(如果三个顾客均向不同的售票员对象买票结果可想而知。大伙可以动手尝试)
package a0315_3;
//下列中有三个类 ,分别是ex测试类, buyTickets, TicketSeller
public class ex {
public static void main(String args[]) {
TicketSeller seller = new TicketSeller();
buyTickets buy_z = new buyTickets("张 ", 20, seller); // buyTickets是实现了run方法的类,见代码第38行
buyTickets buy_l = new buyTickets("李 ", 10, seller);
buyTickets buy_w = new buyTickets("王 ", 5, seller);
Thread thread_z = new Thread(buy_z); // 三位工人分别接手工作
Thread thread_l = new Thread(buy_l);
Thread thread_w = new Thread(buy_w);
thread_z.setName("张 ");
thread_l.setName("李 ");
thread_w.setName("王 ");
thread_z.start(); // 线程按顺序开始,(模拟排队)
int count = 0;
while (count < 1000000) { //世界上最原始的方法
count++;
}
thread_l.start();
count = 0;
while (count < 1000000) {
count++;
}
thread_w.start();
}
}
class buyTickets implements Runnable { // 买票这个工作
String name;
int money;
TicketSeller seller;
buyTickets(String name1, int money1, TicketSeller seller1) {
name = name1;
money = money1;
seller = seller1;
}
public void run() {
System.out.println(name + "开始进行买票");
seller.sellTicket(money); //携带钱去买票
}
}
class TicketSeller // 负责卖票的类。(售票员类)
{
int fiveMoney = 3, tenMoney = 0, twentyMoney = 0;
public synchronized void sellTicket(int receiveMoney) {
if (receiveMoney == 5) { // 张 有五块直接走
fiveMoney = fiveMoney + 1;
System.out.println(Thread.currentThread().getName() + "给我5元钱,不找钱");
System.out.println(Thread.currentThread().getName() + "离开队列");
}
else if (receiveMoney == 10) { // 李
while (fiveMoney < 1) { // 柜台没有五块零钱 就靠边等(循环)
try {
System.out.println(Thread.currentThread().getName() + "靠边等待!下一个先来");
wait();
System.out.println(Thread.currentThread().getName() + "结束等待");
} catch (InterruptedException e) {
}
}
fiveMoney = fiveMoney - 1;
tenMoney = tenMoney + 1;
System.out.println(Thread.currentThread().getName() + "给10元钱,找5元");
System.out.println(Thread.currentThread().getName() + "离开队列");
}
else if (receiveMoney == 20) { // 赵 (柜台没有一张五块一张十块)又没有 (三张五块)就靠边等(循环)
while ((fiveMoney < 1 || tenMoney < 1) && fiveMoney < 3) {
try {
System.out.println(Thread.currentThread().getName() + "靠边等待!下一个先来");
wait();
System.out.println(Thread.currentThread().getName() + "结束等待");
} catch (InterruptedException e) {
}
}
if (fiveMoney < 3) {
fiveMoney = fiveMoney - 1;
tenMoney = tenMoney - 1;
twentyMoney = twentyMoney + 1;
System.out.println(Thread.currentThread().getName() + "给20元钱,找一张5元和一张10元");
}
else if (fiveMoney < 1 || tenMoney < 1) {
fiveMoney = fiveMoney - 3;
twentyMoney = twentyMoney + 1;
System.out.println(Thread.currentThread().getName() + "给20元钱,找三张5元");
}
System.out.println(Thread.currentThread().getName() + "离开队列");
}
notifyAll(); // 通知等待中的线程
System.out.println("下一个!下一个!!!");
}
}
运行结果 :
如果对你有所帮助,给个三连+关注吧~