java多线程对Runnable和Thread的理解及简述,内附实例。

启动线程的两个步骤:

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("下一个!下一个!!!");
	}
}


运行结果 :

如果对你有所帮助,给个三连+关注吧~

 

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电光火石尔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值