基础概念
进程(Process):
计算机中的程序关于某数据集合上的一次运行活动
系统进行资源分配和调度的基本单位
操作系统结构的基础。
线程,轻量进程(Lightweight Process,LWP):
程序执行流的最小单元。
由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
同步线程:
其他线程之间共享数据或协调执行状态。
守护线程(Daemon):
运行在后台的一种特殊进程。
独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。
多线程(multithreading):
同时对多个线程加以控制。
多线程是异步的。
死锁:
两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。这些永远在互相等待的进程称为死锁进程。
线程组(ThreadGroup):
每个Java线程都是某个线程组的成员。
线程组提供一种机制,使得多个线程集于一个对象内,能对它们实行整体操作。
当线程产生时,可以指定线程组或由实时系统将其放入某个缺省的线程组内。
线程只能属于一个线程组,并且当线程产生后不能改变它所属的线程组。
线程优先级:
- Thread.MAX_PRIORITY //线程最大权限:10
- Thread.MIN_PRIORITY //线程最小权限:1
- Thread.NORM_PRIORITY //线程默认权限:5
在任何时刻,如果有多条线程等待运行,系统选择优先级最高的可运行线程运行。
只有当它停止、自动放弃、或由于某种原因成为非运行态,低优先级的线程才能运行。
如果两个线程具有相同的优先级,它们将被交替地运行。
线程的状态:
- 就绪(Ready)
- 堵塞(Blocked)
- 运行(Running)
使用范围
- 服务器中的文件管理或通信控制
- 前后台处理
- 异步处理
常用操作
- 把竞争访问的资源标识为private;
- 同步哪些修改变量的代码,使用synchronized关键字同步方法或代码
Thread类
public class Thread
extends Object
implements Runnable
每个线程都有一个优先级,高优先级线程的执行优先于低优先级线程。
每个线程都可以或不可以标记为一个守护程序。
每个线程都有一个标识名(创建时没有指定,则自动创建),多个线程可以同名。
当某个线程中运行的代码创建一个新 Thread 对象时,该新线程的初始优先级被设定为创建线程的优先级,并且当且仅当创建线程是守护线程时,新线程才是守护程序。
内部类
- static class Thread.State //线程状态
- static interface Thread.UncaughtExceptionHandler 当 Thread 因未捕获的异常而突然终止时,调用处理程序的接口。
属性
- static int MAX_PRIORITY //线程可以具有的最高优先级。
- static int MIN_PRIORITY //线程可以具有的最低优先级。
- static int NORM_PRIORITY //分配给线程的默认优先级。
构造方法
- Thread()
- Thread(Runnable target) //分配新的 Thread 对象。
- Thread(Runnable target, String name)
- Thread(String name)
- Thread(ThreadGroup group, Runnable target) //线程组的一员。
- Thread(ThreadGroup group, Runnable target, String name) //将 target 作为其运行对象
- Thread(ThreadGroup group, Runnable target, String name, long stackSize) //具有指定的堆栈大小。
- Thread(ThreadGroup group, String name)
常用方法
- static int activeCount() //返回当前线程的线程组中活动线程的数目
- static Thread currentThread() //返回对当前正在执行的线程对象的引用
- static int enumerate(Thread[] tarray) //将当前线程的线程组及其子组中的每一个活动线程复制到指定的数组中
- ClassLoader getContextClassLoader() //返回该线程的上下文 ClassLoader
- long getId() //返回该线程的标识符。
- String getName() //返回该线程的名称。
- int getPriority() //返回线程的优先级 。
- Thread.State getState() //返回该线程的状态。
- ThreadGroup getThreadGroup() //返回该线程所属的线程组
- static boolean holdsLock(Object obj) //线程在指定的对象上保持监视器锁时,才返回 true
- void interrupt() //中断线程。
- static boolean interrupted() //测试当前线程是否已经中断。
- boolean isAlive() //测试线程是否处于活动状态。
- boolean isDaemon() //测试该线程是否为守护线程。
- boolean isInterrupted() //测试线程是否已经中断。
- void join() //等待该线程终止。
- void join(long millis) //等待该线程终止的时间最长为 millis 毫秒。
- void join(long millis, int nanos) //等待该线程终止的时间最长为 millis 毫秒 + nanos 纳秒
- void run() //如果该线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run 方法;否则,该方法不执行任何操作并返回。
- void setContextClassLoader(ClassLoader cl) //设置该线程的上下文 ClassLoader。
- void setDaemon(boolean on) //将该线程标记为守护线程或用户线程
- void setPriority(int newPriority) //更改线程的优先级
- static void sleep(long millis) //让当前正在执行的线程休眠(暂停执行),此操作受到系统计时器和调度程序精度和准确性的影响。
- static void sleep(long millis, int nanos)
- void start() //使该线程开始执行;Java 虚拟机调用该线程的 run 方法
- static void yield() //暂停当前正在执行的线程对象,并执行其他线程
Runnable接口
由那些打算通过某一线程执行其实例的类来实现。
类必须定义一个称为 run 的无参数方法。
目的是为希望在活动时执行代码的对象提供一个公共协议。
方法
- void run() //创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法