• 线程与进程


    String: 表示不可变的类,非常常用:    判断创建了几个String对象:      String  s  = new  String("OOXX");    1个或两个:  若常量池里已经存在"OOXX",那么直创建一个String对象  若常量池里没有"OOXX",那么先在常量池创建"OOXX",再在堆里创建一个String对象;        String  s = "A"+"B"+"C";  编译的时候,把"A"+"B"+"C",转成了 "ABC";    String  s2 = s + "AA";在运行期的时候会创建"ABCAA"    常用方法参见API ;  

    StringBuffer/StringBuilder:  表示可变的字符串;  StringBuffer/StringBuilder区别:  StringBuffer:线程安全的,适合用于多线程中,但是性能低一点;  StringBuilder(java5): 线程不安全的,适合用于单线程中,性能高一点; 官方推荐使用的    append(Object o):表示在其对象的内容后面追加新的内容,    适用于 拼写字符串,其性能远远高于String;    常用方法参见API ;  

    Math:  封装了数学上的很多公式,算法那些;    常量:   double e  = Math.E;  double pi = Math.PI;    伪随机数:    Math.random();//生成[0.0,1.0)之间的一个随机数      静态导入: 导入的是一个类里面的静态成员:    import  static  java.lang.Math.PI;    import  static  java.lang.Math.*;  

    Random:  new  Random().nextXxx(int max);//表示[0,max)之间的一个伪随机数   UUID:  表示128位的唯一的字符串    UUID uuid = UUID.randomUUID();    String uid = uuid.toString();    适合用于做数据库的主键;  

    BigInteger:  大整型:    创建对象:  new  BigInteger(String val);     BigInteger add(BigInteger otherVal);    BigInteger subtract(BigInteger val)     BigInteger multiply(BigInteger val)     BigInteger divide(BigInteger val)      BigDecimal:  可表示任意精度的数据:    new BigDecimal(double val);//依然不能精确表示数据    new BigDecimal(String val);//才能精确,适合用于财务金钱,精度要求高的数据      BigDecimal add(BigDecimal otherVal);    BigDecimal subtract(BigDecimal val)     BigDecimal multiply(BigDecimal val)     BigDecimal divide(BigDecimal val)      {  private BigDecaimal  total;//总金额

    }

    进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以有多个线程。比如在Windows系统中,一个运行的xx.exe就是一个进程。
    Java程序的进程里有几个线程:主线程, 垃圾回收线程(后台线程)
    线程是指进程中的一个执行任务(控制单元),一个进程中可以运行多个线程,多个线程可共享数据。
    多进程:操作系统中同时运行的多个程序;
    多线程:在同一个进程中同时运行的多个任务;
    一个进程至少有一个线程,为了提高效率,可以在一个进程中开启多个控制单元。 
    并发运行。如:多线程下载软件。 
    可以完成同时运行,但是通过程序运行的结果发现,虽然同时运行,但是每一次结果都不一致。 
    因为多线程存在一个特性:随机性。 
    造成的原因:CPU在瞬间不断切换去处理各个线程而导致的。 
    可以理解成多个线程在抢cpu资源。

    线程具有许多传统进程所具有的特征,故又称为轻型进程(Light—Weight Process)或进程元;
    而把传统的进程称为重型进程(Heavy—Weight Process),它相当于只有一个线程的任务。在引入了线程的操作系统中,通常一个进程都有若干个线程,至少需要一个线程。

    进程与线程的区别:
     1.进程有独立的进程空间,进程中的数据存放空间(堆空间和栈空间)是独立的。
     2.线程的堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以影响的。

    继承Thread类
    子类覆写父类中的run方法,将线程运行的代码存放在run中。
    建立子类对象的同时线程也被创建。 

    package thread;

    /**  * 创建线程第二种方式:  *  * 1.定义一个类MyThread实现 Runnable接口 2.实现run方法 3.线程对象的创建, new Thread(Runnable对象)  * 4.依然是调用 线程类的start方法;  *  */ class MyThread2 implements Runnable {  @Override  public void run() {   // 线程体   for (int i = 0; i < 100; i++) {    String name = Thread.currentThread().getName();    System.out.println(name+"-->" + i);   }  } }

    public class ThreadDemo2 {  public static void main(String[] args) {

      for (int i = 0; i < 100; i++) {

       System.out.println("main-->" +i);    if (i == 10) {     new Thread(new MyThread2(),"AAA").start();    }   }      System.out.println("------------------------------->");      new Thread(new Runnable(){    public void run() {     for (int i = 0; i <200; i++) {      System.out.println("匿名对象-->" + i);     }    }   },"OOXX").start();  } }

    package thread.ticket;

    /**  *  比较两种方式的区别:  *     *   使用继承方式,资源不能共享;  *  *   继承方式,继承了Thread类之后,就不能再继承其他类了;  *  *     *   从代码的简单性来性,来说继承方式简单些  *  *  *  推荐使用 接口方法,  方便以后拓展;,资源共享  *     *      *  */

    class Ticket2 extends Object implements Runnable{

       int num = 50;  @Override  public void run() {   for (int i = 0; i < 200; i++) {    if(num >0) {     System.out.println(Thread.currentThread().getName()+"卖出第" +num-- +"张");    }   }  }   } public class TicketDemo2 {  public static void main(String[] args) {   Runnable target = new Ticket2();   new Thread(target,"A").start();   new Thread(target,"B").start();   new Thread(target,"C").start();  } }


    通过调用start方法开启线程。继承Thread类
    子类覆写父类中的run方法,将线程运行的代码存放在run中。
    建立子类对象的同时线程也被创建。
    通过调用start方法开启线程。

    class MyThread extends Thread{    public MyThread(String name) {   super(name);  }

     public void run() {   //线程体   for (int i = 0; i < 100; i++) {    //setName("Springbrother");    System.out.println(super.getName()+ i );   }  }   } public class ThreadDemo1 {  public static void main(String[] args) {   for (int i = 0; i < 200; i++) {    //System.out.println(this.getName() + i);    /*     * static Thread currentThread()              返回对当前正在执行的线程对象的引用。     * */        // Thread.currentThread().setName("OOXX");        String name = Thread.currentThread().getName();    System.out.println(name+ "------>" +i);    if(i == 50){     //new MyThread().run();//这个不表示启动线程,仅仅表示调用对象的一个方法而已          new MyThread("凤姐").start();    }   }     }

    package thread.ticket;

    class Ticket1 extends Thread{        int num = 50;    public Ticket1(String name){   super(name);  }  public void run() {      for (int i = 0; i < 200; i++) {    if(num >0) {     System.out.println(getName()+"卖出第" +num-- +"张");    }   }  } } public class TicketDemo {  public static void main(String[] args) {   //3个窗口买   new Ticket1("A").start();   new Ticket1("B").start();   new Ticket1("C").start();  } }

     

  • 相关阅读:
    asmxwebservicebasicauthentication
    asp.net mvc uploading_and_returning_files
    HTTP请求格式 状态码404,404等
    HTTP BASIC 应用(2)
    [转载]HTML生成PDF(c#)
    [转载]ASP.NET MVC的例子中都使用了Repository模式
    spring MVC 如何接收前台传入的JSON对象数组并处理
    表格中的checkbox复选框 全选非全选 公共方法 及提交选中结果
    atitit.提升开发效率MDA 软件开发方式的革命(5)列表查询建模
    atitit.提升开发效率MDA 软件开发方式的革命(3)自动化建表
  • 原文地址:https://www.cnblogs.com/hoobey/p/5247836.html
Copyright © 2020-2023  润新知