线程(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,宏观上让所有线程一起执行 ,也叫并发