Java多线程
【创建线程的方式】
1. 扩展Thread类:
Extend class java.lang.Thread and override run():
class Plum extends Thread {
public void run() {
/* more code */
}
}
Plum P = new Plum();
P.start();
2. 实现Runnable接口:
Implement the Runnable interface, and use that class in the Thread constructor:
class Mango implements Runnable {
public void run() {
/* more code */
}
}
Mango m = new Mango();
Thread t1 = new Thread( m );
t1.start();
【线程的优先级】
可以通过调用Thread类的setPriority()方法改进线程优先级:final void setPriority(int level)
这里,形参level指定了调用线程的新的优先级设置。线程level的值必须在MIN_PRIORITY~MAX_PRIORITY范围内。目前,这两个常量的值分别是1和10.要将线程设置为默认优先级,可以将其指定为NORM_PRIORITY,目前它的值为5。在Thread类内部,这些优先级定义为static final的变量。可以通过调用Thread类的setPriorty()方法来获得当前的优先级设置,如下所示:final int getPriority()
【同步】
1. 使用同步方法:将方法用关键字synchronized修饰。当调用该方法时,调用的线程进入对象的监视器中,将对象锁定。当对象锁定时,其他线程就不能进入该方法,也不能进入该对象类定义的其他同步方法。当线程从方法返回时,监视器解除对对象的锁定,运行该对象用于下一线程。
synchronized void foo() { ... }
2. synchronized语句:synchronized块的一般形式如下所示:
synchronized(objref){
//statements to be synchronized
}
这里,objref是需要同步的对象的引用。一旦进入了同步块,其他线程既不能调用同步方法,也不能进入objref对象指定的同步块,直到退出该块。
【线程通信】
因为Object类实现了方法wait()、notify()、和notifyAll(),所以这些方法是所有对象的一部分。这些方法只能在synchronized内容中调用。他们的使用方法如下:当一个线程暂时从运行状态中阻塞时,它调用wait()方法。这引起线程休眠,并释放对象的监视器,运行其他线程使用该对象。在之后的某个时间,当其他线程进入同一监视器并调用方法notify()或notifyAll()时,休眠的线程醒来。