程序:可以理解为一组静态的代码
进程:正在进行的程序 静态的代码 运行起来
线程:正在执行程序中的小单元
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("; 终点地址:"); sbb.append(end); sbb.append("; 票价为:"); 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<Ticket> 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(); } }