Java 线程基础

来源:互联网 发布:盘古软件源 编辑:程序博客网 时间:2024/05/16 11:23

一.Java中实现多线程

A.继承Thead类,重写run方法;

B.实现接口Runnable;

 

二.线程的六种状态

1.新生(new):

当用new操作符创建一个新的线程,尚未执行(start方法尚未被调用)。

 

2.可运行(runnable):

一旦调用start方法,线程处于runnable状态;

线程的运行取决操作系统给线程提供可运行的时间;

在任何给定时刻,一个可运行的线程可能正在运行也可能没有运行。

 

3.被阻塞(blocked):

当一个线程试图获取一个内部的对象锁,而该锁被其他线程持有,则该线程进入阻塞状态。

当所有其他线程释放该锁,且线程调度器允许本线程持有它时,该线程变成非阻塞状态。

 

4.等待(waiting):

当线程等待另一个线程通知调度器一个条件时,它自己进入等待状态。

4.计时等待(timed waiting):

有几个方法有一个超时参数。调用它们导致线程进入计时等待状态。

这一状态将一直保持到超时期满或者接收到适当的通知。

带有超时参数的方法有Thread.sleep和Object.wait, Thread.join, Lock.tryLock以及Condition.await的计时版。

 

5.被终止(terminated):

正常情况下run方法返回使得线程死亡。

因为一个没有捕获的异常终止了run方法而意外死亡。

调用 stop方法杀死一个线程,会抛出ThreadDeath错误对象。stop方法已过时。

 

三:线程的属性

1.线程优先级

每一个线程有一个优先级,默认继承父线程的优先级。

可通过调用getPriority和setPriority方法来存取设置线程的优先级。

线程的优先级界于1(MIN_PRIORITY)和10(MAX_PRIORITY)之间,缺省是5(NORM_PRIORITY)。

线程优先级高度依赖于系统本身的线程实现机制,Windows有7个优先级别,Sun为Linux提供的

Java虚拟机,线程的优先级被忽略-所有线程具有相同优先级。

不要将程序的构建依赖于优先级。

 

2.守护线程

调用t.SetDaemon(true);将线程转换为守护线程(daemon thread)。

守护线程的唯一用途是为其他线程提供服务,如计时线程。

守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时刻甚至在一个操作的中间发生中断。

 

3.处理未捕获异常的处理器

不需要任何catch子句来处理可被传播的异常,在线程死亡前,异常被传递到一个用于未捕获异常的处理器。

该处理器必须属于一个实现Thread.UncaughtExceptionHandler接口的类,这个接口只有一个方法:

void uncaughtException(Thread t,Throwable e)。 

可以用setUncaughtExceptionHandler方法为任何一个线程安装一个处理器。

也可以用setDefaultUncaughtExceptionHandler为所有线程安装一个默认的处理器。

 

4.线程组

所有线程都隶属于一个线程组。那可以是一个默认线程组,亦可是一个创建线程时明确指定的组。

在创建之初,线程被限制到一个组里,而且不能改变到一个不同的组。

每个应用都至少有一个线程从属于系统线程组。

若创建多个线程而不指定一个组,它们就会自动归属于系统线程组。

线程组也必须从属于其他线程组。

必须在构建器里指定新线程组从属于哪个线程组。

若在创建一个线程组的时候没有指定它的归属,则同样会自动成为系统线程组的一名属下。

因此,一个应用程序中的所有线程组最终都会将系统线程组作为自己的“父”。

线程组中的线程可以修改组内的其他线程,包括那些位于分层结构最深处的。

一个线程不能修改位于自己所在组或者下属组之外的任何线程。

定义一个线程组,通过以下代码可以实现。

ThreadGroup group = new ThreadGroup("group");

Thread thread=new Thread(group,"the first thread of group");

原创粉丝点击