线程

线程(Thread)

创建线程的两种方式

继承 extends Thread
实现 implements Runnable

本质上:就是一个Thread,那么Runnable接口定义了run方法,run方法
就是你这个线程要做的任务。

什么是线程

进程是指在系统中正在运行的一个应用程序;线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元。对于操作系统而言,其调度单元是线程。
可以理解成一个或多个线程组成了一个进程
给你举个例子
在线看视频 其实是 一边从网上下载 一边用播放器播放,从进程来讲就一个(咱们打开的网页) , 其中下载由一个线程管理,播放由一个线程管理.

T.run()和t.start()有什么区别;

解:run方法不会创建栈,start会创建栈

new thread时,都干了什么?

init方法(1,2,3,4);
stackSize-10N

实例:去银行取钱(模式为策略模式)
1.Account类

public class Account {
	private String cardno;//姓名
	private int banlance;//余额
	public Account(String cardno, int banlance) {
		super();
		this.cardno = cardno;
		this.banlance = banlance;
	}
	public String getCardno() {
		return cardno;
	}
	public void setCardno(String cardno) {
		this.cardno = cardno;
	}
	public int getBanlance() {
		return banlance;
	}
	public void setBanlance(int banlance) {
		this.banlance = banlance;
	}
	
}

2.取钱的算法操作
(策略模式)
关键字 synchronized类似于信号量S,只允许单个用户进入。

public class Bank {
	public synchronized void action(Account account,int money)
	{	
		if(money<account.getBanlance())
		{
			account.setBanlance(account.getBanlance()-money);
			System.out.println(account.getCardno()+"取了"+money+" 还剩:"+account.getBanlance());
		}
	}
}

3.自定义线程类

public class Mythread1 extends Thread{
	Bank bank = new Bank();
	Account account;
	int money;
	public Mythread1(Bank bank, Account account, int money) {
		super();
		this.bank = bank;
		this.account = account;
		this.money = money;
	}
	@Override
	public void run() {
		
		bank.action(account, money);
	}
}

4.测试类

public class Test {
	public static void main(String[] args) {
		Account account = new Account("dinger",2000);
		
		Bank bank = new Bank();
		Mythread1 mythread1 = new Mythread1(bank,account,200);
		Mythread1 mythread2 = new Mythread1(bank,account,200);
		mythread1.start();
		mythread2.start();
	}
}

结果:
在这里插入图片描述

思考:为什么要执行的内容要写在run中,而启动线程要调用start();

多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run()。

调用start()后,线程会被放到等待队列,等待CPU调度,并不一定要马上开始执行,只是将这个线程置于可动行状态。然后通过JVM,线程Thread会调用run()方法,执行本线程的线程体。先调用start后调用run,这么麻烦,为了不直接调用run?就是为了实现多线程的优点,没这个start不行。

1.start()方法来启动线程,真正实现了多线程运行。这时无需等待run方法体代码执行完毕,可以直接继续执行下面的代码;通过调用Thread类的start()方法来启动一个线程, 这时此线程是处于就绪状态, 并没有运行。 然后通过此Thread类调用方法run()来完成其运行操作的, 这里方法run()称为线程体,它包含了要执行的这个线程的内容, Run方法运行结束, 此线程终止。然后CPU再调度其它线程。
2.run()方法当作普通方法的方式调用。程序还是要顺序执行,要等待run方法体执行完毕后,才可继续执行下面的代码; 程序中只有主线程——这一个线程, 其程序执行路径还是只有一条, 这样就没有达到写线程的目的。
记住:多线程就是分时利用CPU,宏观上让所有线程一起执行 ,也叫并发

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值