zoukankan      html  css  js  c++  java
  • java线程

    程序:可以理解为一组静态的代码

    进程:正在进行的程序   静态的代码  运行起来

    线程:正在执行程序中的小单元

    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();
    	}
    }
    

      

     

     

     

     

    越努力,越幸运!!! good good study,day day up!!!
  • 相关阅读:
    解决Qt5 Creator无法切换输入法(fcitx),不能录入汉字问题
    QProcess进程间双向通信
    DB2使用存储过程插入数据
    Qt自定义圆周动画(360 10.0 的模仿作者写的)
    经典重温:给微软上课的快乐车夫
    很劲爆!紫光赵伟国在北京微电子会议上12条惊人语录
    中芯国际董事长周子学:技术终有山顶,我们用时间换技术
    windows完全支持C++11的轻量级编译器(官网MinGW和非官方的MinGW-builds)
    VMwarevSphere 服务器虚拟化之二十九 桌面虚拟化之安装View副本服务器
    Qt判断和打开进程(windows端),运行,检测,中止
  • 原文地址:https://www.cnblogs.com/canglongdao/p/13040286.html
Copyright © 2011-2022 走看看