程序
程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。
进程
进程(process)是程序的一次执行过程,或是正在运行的一个程序。是一个动态 的过程:有它自身的产生、存在和消亡的过程。——生命周期,如:运行中的QQ,运行中的MP3播放器 ;程序是静态的,进程是动态的 ;进程作为资源分配的单位,系统在运行时会为每个进程分配不同的内存区域。
线程
线程(thread),进程可进一步细化为线程,是一个程序内部的一条执行路径。 若一个进程同一时间并行执行多个线程,就是支持多线程的 。线程作为调度和执行的单位,每个线程拥有独立的运行栈和程序计数器(pc),线程切换的开销小 。一个进程中的多个线程共享相同的内存单元/内存地址空间。它们从同一堆中分配对象,可以 访问相同的变量和对象。这就使得线程间通信更简便、高效。但多个线程操作共享的系统资 源可能就会带来安全的隐患。
线程是程序中执行的线程。 Java虚拟机允许应用程序同时执行多个执行线程。每个线程都有优先权。 具有较高优先级的线程优先于优先级较低的线程执行。 每个线程可能也可能不会被标记为守护程序。 当在某个线程中运行的代码创建一个新的Thread
对象时,新线程的优先级最初设置为等于创建线程的优先级,并且当且仅当创建线程是守护进程时才是守护线程。
当Java虚拟机启动时,通常有一个非守护进程线程(通常调用某些指定类的名为main
的方法)。 Java虚拟机将继续执行线程,直到发生以下任一情况:
- 已经调用了
Runtime
类的exit
方法,并且安全管理器已经允许进行退出操作。 - 所有不是守护进程线程的线程都已经死亡,无论是从调用返回到
run
方法还是抛出超出run
方法的run
。
创建一个新的执行线程有两种方法。 一个是将一个类声明为Thread
的子类。 这个子类应该重写run
类的方法Thread
。 然后可以分配并启动子类的实例。
方法一:继承Thread类
class PrimeThread extends Thread {
long minPrime;
PrimeThread(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
调用:
PrimeThread p = new PrimeThread(143);
p.start();
方法二:实现类Runnable
接口
class PrimeRun implements Runnable {
long minPrime;
PrimeRun(long minPrime) {
this.minPrime = minPrime;
}
public void run() {
// compute primes larger than minPrime
. . .
}
}
调用
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
优先级
static int | MAX_PRIORITY 线程可以拥有的最大优先级。 |
static int | MIN_PRIORITY 线程可以拥有的最小优先级。 |
static int | NORM_PRIORITY 分配给线程的默认优先级。 |
构造方法
Thread() 分配一个新的 |
Thread(Runnable target) 分配一个新的 |
Thread(Runnable target, String name) 分配一个新的 |
Thread(String name) 分配一个新的 |
Thread(ThreadGroup group, Runnable target) 分配一个新的 |
Thread(ThreadGroup group, Runnable target, String name) 分配一个新的 |
Thread(ThreadGroup group, Runnable target, String name, long stackSize) 分配一个新的 |
Thread(ThreadGroup group, String name) 分配一个新的 |
方法
修饰语和类型 | 方法和描述 |
---|---|
static int | activeCount() 返回当前线程的thread group及其子组中活动线程数的估计。 |
void | checkAccess() 确定当前正在运行的线程是否有权限修改此线程。 |
protected Object | clone() 将CloneNotSupportedException作为线程抛出无法有意义地克隆。 |
static Thread | currentThread() 返回对当前正在执行的线程对象的引用。 |
static void | dumpStack() 将当前线程的堆栈跟踪打印到标准错误流。 |
static int | enumerate(Thread[] tarray) 将当前线程的线程组及其子组中的每个活动线程复制到指定的数组中。 |
static Map<Thread,StackTraceElement[]> | getAllStackTraces() 返回所有活动线程的堆栈跟踪图。 |
ClassLoader | getContextClassLoader() 返回此Thread的上下文ClassLoader。 |
static Thread.UncaughtExceptionHandler | getDefaultUncaughtExceptionHandler() 返回当线程由于未捕获异常突然终止而调用的默认处理程序。 |
long | getId() 返回此线程的标识符。 |
String | getName() 返回此线程的名称。 |
int | getPriority() 返回此线程的优先级。 |
StackTraceElement[] | getStackTrace() 返回表示此线程的堆栈转储的堆栈跟踪元素数组。 |
Thread.State | getState() 返回此线程的状态。 |
ThreadGroup | getThreadGroup() 返回此线程所属的线程组。 |
Thread.UncaughtExceptionHandler | getUncaughtExceptionHandler() 返回由于未捕获的异常,此线程突然终止时调用的处理程序。 |
static boolean | holdsLock(Object obj) 返回 true当且仅当当前线程在指定的对象上保持监视器锁。 |
void | interrupt() 中断这个线程。 |
static boolean | interrupted() 测试当前线程是否中断。 |
boolean | isAlive() 测试这个线程是否活着。 |
boolean | isDaemon() 测试这个线程是否是守护线程。 |
boolean | isInterrupted() 测试这个线程是否被中断。 |
void | join() 等待这个线程死亡。 |
void | join(long millis) 等待这个线程死亡最多 |
void | join(long millis, int nanos) 等待最多 |
void | run() 如果这个线程使用单独的 |
void | setContextClassLoader(ClassLoader cl) 设置此线程的上下文ClassLoader。 |
void | setDaemon(boolean on) 将此线程标记为 daemon线程或用户线程。 |
static void | setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 设置当线程由于未捕获的异常突然终止而调用的默认处理程序,并且没有为该线程定义其他处理程序。 |
void | setName(String name) 将此线程的名称更改为等于参数 |
void | setPriority(int newPriority) 更改此线程的优先级。 |
void | setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh) 设置当该线程由于未捕获的异常而突然终止时调用的处理程序。 |
static void | sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性。 |
static void | sleep(long millis, int nanos) 导致正在执行的线程以指定的毫秒数加上指定的纳秒数来暂停(临时停止执行),这取决于系统定时器和调度器的精度和准确性。 |
void | start() 导致此线程开始执行; Java虚拟机调用此线程的 |
String | toString() 返回此线程的字符串表示,包括线程的名称,优先级和线程组。 |
static void | yield() 对调度程序的一个暗示,即当前线程愿意产生当前使用的处理器。 |