1.线程简介:
进程本质上是一个执行的程序,操作系统引入进程后就允许计算机可以同时运行两个或两个以上的程序,这就是多任务的处理模式。每一个进程都有自己独立的一块内存空间,一组系统资源,在进程的概念中,每一个进程的内部数据和状态都是完全独立的。
线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的控制流,但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源的,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈,所以系统在产生一个线程,或者各个线程间切换时,负担要比进程小得多,正因如此,线程也被称为轻量进程(light—weight process)
2.线程的创建方法:
Java提供了线程类Thread来创建多线程的程序,
其实,创建线程与普通的类的对象的操作是一样的,而线程就是Thread类或者其子类的实例对象。
每个Thread对象描述了一个单独的线程,要产生一个线程,有两种方法:
(1).需要从Java.lang.Thread 类派生一个新的线程类,重写它的run()方法。
(2).实现Runnable接口,实现 Runnable接口中的run()方法。
注意:当我们使用实现Runnable接口定义一个线程类的时候,不能直接运行线程,必须使用Thread的构造方法 public Thread (Runnable target)
具体如下:
3.线程的常用方法:
Thread. currentThread()可以获取到当前的线程对象,该对象拥有所有线程相关的状态描述。
需要注意的是currentThread方法需要使用类名调用才能得到正确的状态描述。
获得线程对象currentThread 后,具有以下常用方法:
我们使用线程的start方法来启动一个线程,此时目标线程对象才会以一个独立线程的身份运行在JVM上。
当我们需要某个线程进入休眠状态的时候,可以使用sleep方法将线程状态(state)设置为TIMED_WAITING。
线程在sleep后,通常不能被中断(interrupt),interrupt只是尝试停止一个线程,并没有任何机制保证这个interrupt操作会真的成功。
(1).join方法简介:
前提: 设有两个线程,其中一个为主线程,在主线程中调用另外一个线程,称为目标线程。
情景: 在主线程中创建子线程,并启动子线程,而子线程中要进行大量的耗时运算,当主线程处理到某个位置时,需要用到子线程的处理结果(此时子线程还未结束),
这时候就要用到join();方法。
在主线程的某个位置执行了目标线程.join();方法后,主线程将不再继续向下执行,而将等待目标线程终止后,主线程才会再向下执行。
4.synchronized同步处理简介:
无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
每个对象只有一个锁(lock)与之相关联。
实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
当我们明确知道要对某个对象加锁,而非整个类的实例加锁时,应该使用synchronized (object),注意不能对基本数据类型直接加Synchronized关键字。
同时当我们的成员变量需要加锁时,应该将该变量设置为private,并且提供Synchronized修改的get方法,以保证该成员遵循同步机制。
5.wait和notifyAll方法简介:
wait()必须在synchronized方法或代码块内部使用,wait()会让已经获得synchronized方法或代码块控制权的Thread暂时休息,并且丧失控制权。
此时,由于该线程丧失控制权并且进入等待状态,所以其他线程就能取得控制权,并且在适当情况下调用notifyAll()来唤醒wait()的线程。
需要注意的是,被唤醒的线程由于已经丧失了控制权,所以需要等待唤醒它的线程结束操作,从而才能重新获得控制权。
特别注意的是,notifyAll()并不是让当前线程马上让出控制权,而只是让其他wait()当中的线程唤醒而已。
6.内部类简介:
java中允许在类的内部再声明一个类,其中被嵌套的类称为内部类,包裹内部类的类叫做外部类。内部类使用外部类的所有成员变量和方法。
示例如下:
7.匿名内部类简介:
在java运行期,可以创建某个类的上转型对象,并重写这个类的一部分(或全部)方法,但不用为这个对象声明具体的子类名称,java称这种类为匿名内部类。
示例如下:
8.监听模式:
我们称在主线程中启动一个循环任务,不间断的获取目标程序的状态的运行模式,称为监听模式。
代码示例如下:
9.栈stack简介:
Java中使用Stack类表示一个栈,栈由Vector派生而来,栈在Vector的基础上增加了一些特性,但由于java的派生机制,一个栈具有Vector的所有属性。
一个Stack对象希望用户遵循先进后出的元素,即压栈(push)和弹栈(pop)两个动作,
stack只可以把栈顶的元素弹出栈中,这样才是一个合理的栈类型数据结构。
使用peek方法获取栈顶元素,但并不将栈顶元素弹出栈。
10.Timer和TimeTask类简介:
Timer类是JDK提供的用于简单调度的类,该类可以将一个TimerTask任务按照一定的时间规律循环执行。
TimerTask (任务)和Timer(调度)
TimerTask 是一个抽象任务类,需要重写run方法。
Timer类使用schedule方法执行调度任务
使用语法:
Timer time = new Timer();
TimerTask task = new TimerTask();
time.schedule (task, 1000, 5000);
(1)task表示要执行的任务。
(2)1000表示第一次执行时间距离当前时间的毫秒数。
(3)5000表示每次执行任务的间隔时间(单位:毫秒)。
代码示例如下: