1、开启一个新线程的方法,归结起来不外乎有两种:
4、处理 uncaught exceptions:
当一个线程的run()方法执行完毕或者run()方法执行return语句时,线程正常中止。当run方法抛出一个unchecked异常时(注意:run方法是不能抛出checked异常的),线程也会中止并且打印出异常信息。如果你想捕获处理该异常,则必须为该线程添加一个uncaught exception handler来执行。例如:
- 继承类java.lang.Thread ,覆盖其中的方法 run(); 实例化该子类,例如:
public class MyThread extends Thread
{
public void run()
{
// do some work
}
}
// code to use MyThread
new MyThread().start();
- 定义一个实现接口 java.lang.Runnable; 的类,实现该接口的方法run(); 然后将该类的一个实例作为实参传给Thread的构造方法。例如:
public class MyThread2 implements Runnable
{
public void run()
{
// do some work
}
}
// code to use MyThread2
Thread t = new Thread(MyThread2);
t.start();
- 无论用哪种方法最终得到的都是一个Thread的object,当调用方法start()时,系统将创建一个新的线程来执行run() 方法,这个新的线程将一直运行知道run方法退出。在新线程开始运行的同时,原来的线程也将继续执行start()之后的代码。
- NEW : 线程已经被创建,但是start()方法还没被调用,所有的线程都是从这个状态开始的
- RUNABLE : 该线程已经在JVM上执行了,但可能还在等待操作系统种的其他资源,也就是说要么现在就在运行,要么只要操作系统调度到该线程时立即就可以执行。
- BLOCKED : 线程并没有运行因为它必须等待直到获得一个锁以便进入一个synchronized的方法或者块。
- WAITING : 线程并没有运行因为它已经调用了方法 Object.wait()或者 Thread.join( ).
- TIMED_WAITING :线程并没有运行因为它已经调用了Thread.sleep()或者调用了使用timeout值的Object.wait()或者 Thread.join( ).
- TERMINATED : 线程已经完成执行任务,即run()方法要么正常退出,要么抛出一个异常。
public
final
static
int
MIN_PRIORITY
=
1
;
//
最小优先级
public final static int NORM_PRIORITY = 5 ; // 默认的优先级
public final static int MAX_PRIORITY = 10 ; // 最大优先级
一个线程的优先级可以是1到10中任何一个整数(包括1和10).方法
void setPriority(int newPriority) 可以用来设置线程有限级。关于优先级需要注意的是,调度器总是选择优先级最高的线程来执行,但是java的线程优先级是和操作系统相关的,例如windows XP系统有7个优先级,java中的某些优先级会对应到xp的7个优先级中去。但是SUN 的linux版本的JVM上所有线程的优先级都是NORM_PRIORITY。在使用优先级的同时也要避免饿死的情况出现。public final static int NORM_PRIORITY = 5 ; // 默认的优先级
public final static int MAX_PRIORITY = 10 ; // 最大优先级
4、处理 uncaught exceptions:
当一个线程的run()方法执行完毕或者run()方法执行return语句时,线程正常中止。当run方法抛出一个unchecked异常时(注意:run方法是不能抛出checked异常的),线程也会中止并且打印出异常信息。如果你想捕获处理该异常,则必须为该线程添加一个uncaught exception handler来执行。例如:
package uncaughtexception;
public class MyThread implements Runnable
{
@Override
public void run()
{
throw new UnsupportedOperationException();
}
}
public class MyThread implements Runnable
{
@Override
public void run()
{
throw new UnsupportedOperationException();
}
}
package uncaughtexception;
public class TestMyThread
{
public static void main(String [] args)
{
Thread aThread = new Thread(new MyThread());
aThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
System.out.println("Hello");
}
});
aThread.start();
}
}
运行结果: Hellopublic class TestMyThread
{
public static void main(String [] args)
{
Thread aThread = new Thread(new MyThread());
aThread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
System.out.println("Hello");
}
});
aThread.start();
}
}