Java学习(四)

Java学习(四)

标签(空格分隔): Javajava


线程

/**
 * 进程:是一个正在执行中的程序.每个进程执行都有一个执行顺序,该顺序是一个
 * 执行路径,或者叫一个控制单元
 * 线程:就是进程中的一个独立的控制单元,线程控制着进程的执行 * 
 * 一个进程中至少有一个线程
 *java vm 启动的时候会有一个进程java.exe
 *该进程中至少有一个线程,负责java程序的执行,并且这个线程运行的代码存在于
 *main方法中
 *该线程称为主线程
 *
 *
 *扩展:其实更细节说明jvm,jvm启动不止一个线程还有负责垃圾回收机制的线程
 *
 *1.如何在自定义的代码中,自定义一个线程呢
 *
 *经过对api的查找,java已经提供了对线程这类事物的描述,就Thread类'
 *建立线程的第一种方式:继承Thread类
 *步骤:
 *1.定义类继承Thread
 *2.复写Thread类中的run方法
 *目的:将定义的代码存贮在run方法中,让线程运行
 *3.调用线程的start方法,该方法两个做用:
 *启动线程,调用run方法
 *
 *发现运行结果每一次都不一样,由于多个线程都获取cpu的执行权.cpu执行
 *到谁,谁就运行
 *明确一点,在某一个时刻,只能有一个程序在运行(多核除外)
 *cpu在作着快速的切换,以达到看上去是同时运行的效果.
 *咱们能够形象把多线程的运行行为在互相抢夺cpu的执行权
 *这就是一个多线程的特性:随机性
 *谁抢到谁执行,至于执行多长时间,cpu说的算.
 *
 *
 *
 *为何要覆盖run方法
 * 
 * 
 * Thread类用于描述线程
 * 该类就定义了一个功能,用于存储线程要运行的代码.该存储功能就是run方法
 * 
 * 
 * 也就是说Thread类中的run方法,用于存储线程要运行的代码
 */
 
 
class Demo extends Thread
{
    public void run()
    {
        for(int x=0;x<60;x++)
        System.out.println("demo run");
    }
}
public class ThreadDemo {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Demo d=new Demo();//建立好一个线程
        d.run();//仅仅是对象调用方法,而线程建立了,并无运行
        //d.start();//开启线程并执行该线程的run方法
        for(int x=0;x<60;x++)
        {
            System.out.println("hello world");
        }
        
 
    }
 
}

Stack类

/**
 * java中stack的使用方法,堆栈是一种"后进先出"(LIFO)的数据结构,只能在一端进行插入(称为"压栈")或删除(称为"出栈")数据的操做.
 * Java中,使用java.util.Stack类的构造方法建立对象
 * public class Stack extends vector
 * 构造方法:public Stack()建立一个空Stack
 * 1.public push(item)把item压入栈顶.其做用与addElement(item)相同
 * 2.public pop移除栈顶对象,并做为函数的值返回该对象
 * 3.public peek()查看栈顶对象而不移除它
 * 4.public boolean empty()测试堆栈是否为空
 * 5.public int search(Object object)返回对象在堆栈中的位置
 */
import java.util.Enumeration;
import java.util.Stack;
 
/**
 * 学习Stack的用法
 * @author Android将军
 *
 */
public class StackTest {
    public static void main(String[] args) {
        //建立堆栈对象
        Stack stack=new Stack();
        System.out.println("aaaa,bbbb,cccc三个元素入栈");
        //向栈中压入字符串aaaa
        stack.push("aaaa");
        //显示栈中的全部元素
        printStack(stack);
        stack.push("bbbb");
        printStack(stack);
        stack.push("cccc");
        printStack(stack);
        String s=new String("aaaa");
        System.out.println("元素aaaa在堆栈的位置"+stack.search(s));
        s=new String("bbbb");
        System.out.println("元素bbbb在堆栈的位置"+stack.search(s));
        System.out.println("aaaa,bbbb,cccc三个元素出栈");
        System.out.println("元素"+stack.pop()+"出栈");
        printStack(stack);
        System.out.println("元素"+stack.pop()+"出栈");
        printStack(stack);
        System.out.println("元素"+stack.pop()+"出栈");
        printStack(stack);
        
    }
    private static void printStack(Stack stack)
    {
        if(stack.empty())
        {
            System.out.println("堆栈是空的,没有元素");
        }
        else
        {
            System.out.print("堆栈中的元素:");
            //获得Stack中的枚举对象
            Enumeration items=stack.elements();
            //显示枚举(stack)中的全部元素
            while(items.hasMoreElements())
            {
                System.out.print(items.nextElement()+"");
            }
        }
        System.out.println();//换行
    }
}

final的用法

final在java中并不经常使用,然而它却为咱们提供了诸如在c语言中定义常量的功能,不只如此,final还可让你控制你的成员、方法或者是一个类是否可被重写或继承等功能,这些特色使final在java中拥有了一个不可或缺的地位,也是学习java时必需要知道和掌握的关键字之一。android

   final成员:当你在类中定义变量时,在其前面加上final关键字,那即是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来讲是其值不可变,而对于对象变量来讲是其引用不可再变。其初始化能够在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中,注意,这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。还有一种用法是定义方法中的参数为final,对于基本类型的变量,这样作并无什么实际意义,由于基本类型的变量在调用方法时是传值的,也就是说你能够在方法中更改这个参数变量而不会影响到调用语句。然而对于对象变量,却显得很实用,由于对象变量在传递时是传递其引用,这样你在方法中对对象变量的修改也会影响到调用语句中的对象变量,当你在方法中不须要改变做为参数的对象变量时,明确使用final进行声明,会防止你无心的修改而影响到调用方法。api

   final方法:将方法声明为final,那就说明你已经知道这个方法提供的功能已经知足你要求,不须要进行扩展,而且也不容许任何今后类继承的类来重写这个方法,可是继承仍然能够继承这个方法,也就是说能够直接使用。另外有一种被称为inline的机制,它会使你在调用final方法时,直接将方法主体插入到调用处,而不是进行例行的方法调用,例如保存断点,压栈等,这样可能会使你的程序效率有所提升,然而当你的方法主体很是庞大时,或你在多处调用此方法,那么你的调用主体代码便会迅速膨胀,可能反而影响效率,因此你要慎用final进行方法定义。数据结构

   final类:当你将final用于类身上时,你就须要仔细考虑,由于一个final类是没法被任何人继承的,那也就意味着此类在一个继承树中是一个叶子类,而且此类的设计已被认为很完美而不须要进行修改或扩展。对于final类中的成员,你能够定义其为final,也能够不是final。而对于方法,因为所属类为final的关系,天然也就成了final型的。你也能够明确的给final类中的方法加上一个final,但这显然没有意义。
https://blog.csdn.net/android_jiangjun/article/details/41593609多线程

相关文章
相关标签/搜索