标签:
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(); } }
标签:
原文地址:http://www.cnblogs.com/hoobey/p/5247836.html