程序:可以理解为一组静态的代码
进程:正在进行的程序 静态的代码 运行起来
线程:正在执行程序中的小单元
1.主线程 系统线程
2.用户线程 main
3.守护线程(精灵)GC
线程--操作系统级别 CPU
如何在java中创建线程 让线程执行 多线程
掌握每一个线程的几种不同状态 状态之间如何切换
new start() CPU分配(run()) wait() exception over
创建线程---就绪状态---执行状态---等待/挂起---异常/消亡---
| |
|__________________|
notify/notifyAll
启动线程的3种方式:Thread;Runnable;线程池启动线程;
实现线程的过程 (方式1)
1.自己描述一个类
2.继承父类 Thread
3.重写run方法
4.new一个线程对象 调用start()方法 让线程进入就绪状态
实现一个多人跑步的小例子
package test0603;
public class RunningMan extends Thread{
private String name;
public RunningMan(){
}
public RunningMan(String name){
this.name=name;
}
//重写run方法
public void run(){
for(int i=1;i<=100;i++){
System.out.println(this.name+"跑到第"+i+"米");
}
}
}
package test0603;
public class TestMain{
public static void main(String[] args){
RunningMan r1=new RunningMan("张三");
RunningMan r2=new RunningMan("李四");
RunningMan r3=new RunningMan("王五");
//调用start方法 让线程进入就绪状态 CPU分配执行(无序)每次执行结果不一样
/*
r1.start();
r2.start();
r3.start();
*/
//run()方法是顺序执行
r1.run();
r2.run();
r3.run();
}
}
实现线程的过程(方式2)
1.自己描述一个类
2.实现一个父接口Runnable
3.重写run方法
4.new一个线程对象 需要创建Thread将自己的对象包起来 然后调用start()
package test0603;
public class RunningMan implements Runnable{
private String name;
public RunningMan(){
}
public RunningMan(String name){
this.name=name;
}
//重写run方法
public void run(){
for(int i=1;i<=100;i++){
System.out.println(this.name+"跑到第"+i+"米");
}
}
}
package test0603;
public class TestMain{
public static void main(String[] args){
RunningMan r1=new RunningMan("张三");
RunningMan r2=new RunningMan("李四");
RunningMan r3=new RunningMan("王五");
Thread t1=new Thread(r1);
Thread t2=new Thread(r2);
Thread t3=new Thread(r3);
//调用start方法 让线程进入就绪状态 CPU分配执行(无序)每次执行结果不一样
t1.start();
t2.start();
t3.start();
}
}
12306卖票
车票 属性 起始站 终点站 票价
系统 属性 方法
窗口 是一个线程
利用Vector集合,集合本身就是线程安全 多个线程并发操作同一个集合的时候 不会抢夺资源;
1.如何切换线程的不同状态
2.如果在设计中没有集合 我们自己想要控制线程安全
package test0603;
public class Ticket{
//一个对象 包含很多属性 增强可读性 类名 属性名 属性类型不一致;
private String start;//起始站名
private String end;//终点站名
private Float price;
public Ticket(){
}
public Ticket(String start,String end,Float price){
this.start=start;
this.end=end;
this.price=price;
}
public String getStart(){
return start;
}
public void setStart(String start){
this.start=start;
}
public String getEnd(){
return end;
}
public void setEnd(){
this.end=end;
}
public Float getPrice(){
return price;
}
public void setPrice(Float price){
this.price=price;
}
//为了打印一个对象
public String toString(){
StringBuilder sbb=new StringBuilder("[起始地址:");
sbb.append(start);
sbb.append(";\t终点地址:");
sbb.append(end);
sbb.append(";\t票价为:");
sbb.append(price);
sbb.append(";]");
return sbb.toString();
}
}
package test0603;
import java.util.*;
public class System12306{
//设计一个单例模式
private System12306(){
}
private static System12306 sys=new System12306();
public static System12306 getInstance(){
return sys;
}
private Vector tickets=new Vector<>();
{
for(int i=10;i<100;i++){
tickets.add(new Ticket("武汉"+i,"深圳"+i,(i%5+5)*25F));
}
}
//从集合内获取一张票;
public Ticket getTicket(){
try{
return tickets.remove(0);
}catch(Exception e){
return null;
}
}
}
package test0603;
public class Windows extends Thread{
private String windowName;
public Windows(String windowName){
this.windowName=windowName;
}
public void run(){
this.sellTicket();
}
public void sellTicket(){
while(true){
System12306 sys=System12306.getInstance();
Ticket ticket=sys.getTicket();
if(ticket==null){
System.out.println("对不起,本窗口"+windowName+"车票已售完");
break;
}
System.out.println("本窗口"+windowName+"售出"+ticket);
}
}
}
package test0603;
public class TestMain{
public static void main(String[] args){
Windows w1=new Windows("站台A");
Windows w2=new Windows("站台B");
Windows w3=new Windows("站台C");
w1.start();
w2.start();
w3.start();
}
}