目录
线程中断
当JVM虚拟机开始运行,通常会有一个单一非后台运线程(这被称为典型设计类中的主方法)。JVM虚拟机继续执行线程直到下面其中之一的情况出现:
- 运行类执exit()方法,并且安全管理执行者允许执行exit()操作。
- 所有的线程非后台运行程序都已经die,或者运行的线程抛出异常。
线程创建
有两种生成线程执行的方法:
1.声明一个类是继承Thread类的。这个类需要重写Thread类的run()方法。实例化这个类之后可以被分配或者是启动。例如,计算大于规定值的素数的线程可以写成如下:
class PrimeThread extends Thread {
long minPrime;
PrimeThread (long minPrime){
this.minPrime = minPrime;
}
public void ren(){
//计算大于minPrime的素数
...
}
}
生成这个类之后,就可以将其启动运行:
PrimeThread p = new PrimeThread(143);
p.start();
2.声明一个类,该类实现Runnable接口。这个类之后实现run()方法,这个类的实例可以被分配,当创建线程的时候就作为一个参数被编译并且启动。例如:
class PrimeRun implements Runnable{
long minPrime;
PrimeRun(long minPrime){
this.minPrime = minPrime;
}
public void run(){
//compute prime larger than minPeime
...
}
}
通过下面的程序来创建一个线程然后启动:
PrimeRun p = new PrimeRun(143);
new Thread(p).start();
每一个线程都有一个标识的名称。不止一个线程可能有一个相同的名称。如果线程没有在创建的时候被指定,那么就需要指定一个新的名称。除非另外标识,在编译一个空参构造器或者是方法的时候,会抛出一个空指针溢出的异常。自从JDK1.0开始,就已经产生了线程类。
callable接口
继承java.util.concurrent类。Interface Callable<V>,参数V是call方法返回结果的类型。子接口,DocumentationToolDocumentationTask,JavaCompilerCompilationTask。
public interface Callable<V>
该方法返回一个结果,并且抛出一个异常。实现者定义一个没有参数被调用的call方法。
Callable接口和Runnable接口类似,两者都是被设计成用于创建 一个线程。Runnable接口是没有返回值,也不能抛出一个检查异常的。自从JDK1.5开始出现。
方法总结
修饰符和类型 | 方法和描述 |
V | call() |
Thread类
Thread是java.lang包中的一个和线程相关的类,继承于java.lang.Object类下,实现了接口Runnable,直接的子类的是ForkJoinWorkerThread。
一个线程是程序中的执行的线程。JVM允许一个应用同时运行多个线程。
每天一个线程都有优先级别,高优先级的线程比低优先级的线程要优先执行。每一个线程或许可以被看成是一个后台程序。当陈旭在线程中运行生成新的线程对象,一个新的线程的优先级要和之前的线程是相同的,当且只有线程是一个后台执行的程序。
内嵌类的总结
修饰符和类型 | 类和描述 |
static class | Thread.State 线程状态 |
static interface | Thread.UncaughtExceptionHandler 由于不可获取的异常导致线程终止,操作接口执行操作。 |
修饰符和类型 | 类和描述 |
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,longstackSize)
Thread(ThreadGroup group, String name)
方法总结
修饰符和类型 | 方法和描述 |
static int | activeCount() |
void | checkAccess() |
protected Object | clone() |
int | countStackFrame() 废弃 |
static Thread | courrentThread() |
void | destroy() 废弃 |
static void | dumStack() |
static int | enumerate(Thread[] tarry) |
static Map<Thread,StackTraceElement[]> | getAllStackTraces() |
ClassLoader | getContextClassLoader() |
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) |
void | interrupt() |
static boolean | interrupted() |
boolean | isAlive() |
boolean | isDaemon() |
boolean | isInterrupted() |
void | join() |
void | join(long millis) |
void | join(long millis, int nanos) |
void | resume() 废弃 |
void | run() |
void | setContextClassLoader(ClassLoader cl) |
void | setDaemon(boolen on) |
static void | setDefaultUncaughtExcepionHandler(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() |
void | stop() 废弃 |
void | stop(Throwable obj) 废弃 |
void | suspend() 废弃 |
String | toString() |
static void | yield() |
Runnable接口
继承java.lang类。子接口,RunnableFuture<V>,RunnableScheduledFuture<V>。
实现Runnable的类,AsyncBoxView.ChildState,ForkJoinWorkerThread, FutureTask, RenderableImageProducer, SwingWorker, Thread, TimerTask。
实现Runnable接口的类,实例化过程是一个线程的执行。这个类一定要定义一个没有返回值的run()方法。
Runnable是Thread类实现的一个接口。一个线程可以被启动或者是执行未中断就可以简单地理解为是有效的。
另外,Runnable提供给类一种方法,可以在没有继承Thread的时候依旧是有效的。类实现Runnable可以拥有run()方法,不必去继承Thread并且实例化该Thread,只要直接实现Runnable就可以。在大部分情况下,如果你只是想要去重写一个run()的方法,没有其他的Thread类的方法,那么就用Runnable的接口吧。
方法总结
修饰符和类型 | 方法和描述 |
void | run() |
当一个对象通过实现Runnable接口来创建一个线程时,启动这个线程会导致对象的run()方法在单独执行的线程中被调用。