java 线程问题 50
java中对线程描述的类是java.lang.Thread。
创建线程有两种方式:
1.定义一个类继承Thread。
这个类需要复写父类的run方法,线程启动时会自动调用run方法。
创建Thread或其子类对象等于创建了一个线程,调用start()方法启动这个线程,启动线程后会自动调用run方法。
Thread t = new Thread();//创建一个线程。
t.start();//线程开始运行,调用run方法。
//Thread中的run方法没有任何意义,所以需要复写,自定义线程该做的事情。
2.定义一个类实现Runnable,复写run方法,将对象以参数的形式传入Thread的构造函数,调用start方法运行线程。
public class MyThread implements Runnable //定义线程类
{
public void run(){}
static
{
MyThread mt = new MyThread();//创建对象
Thread t = new Thread(mt);//使用构造方法的方式将线程对象传入
t.start();//开启线程并运行run方法
}
}
线程经常会出现安全隐患问题,java 1.5版本之前一般使用同步(synchronized)来解决,在1.5之后java对同步进行了封装,java.util.concurrent.locks.lock,使得同步的使用更加灵活。
线程是拥有优先级的(1-10),优先级高的线程一般来说执行的次数会更多,不过差距并不大,可以调用setPriority(int newPriority)方法自定义线程的优先级。
一个自定义线程可以将其设置为守护线程或用户线程,或者说是后台线程,即在其他线程结束后,这个线程会直接结束,调用setDaemon(boolean on)方法设置。
线程在运行时拥有多个状态:
NEW(未调用start方法)
至今尚未启动的线程处于这种状态。
RUNNABLE(执行)
正在
Java 虚拟机中执行的线程处于这种状态。
BLOCKED(等待)
受阻塞并等待某个监视器锁的线程处于这种状态。
WAITING(冻结)
无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
TIMED_WAITING(睡眠)
等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
TERMINATED(结束)
已退出的线程处于这种状态。
在给定时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态,它们并没有反映所有操作系统线程状态。