线程与进程

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

 

原文地址:https://www.cnblogs.com/hoobey/p/5247836.html