多线程
查看:http://lavasoft.blog.51cto.com/62575/27069
01.你可以通过两种途径定义和初始化一个线程:(1)扩展java.lang.Thread类;该方法一般重叠(override)run()方法,当然你也可以重载该方法,但是重载的run方法将不会被系统(自动)调用,除非用户手动调用;(2)实现Runnable接口;
02.使用isAlive()方法是判断一个线程是否是已经启动但还没有执行run()方法的最好途径;
03.当一个对象调用sleep()方法后,它将仍然拥有它在调用该方法前拥有的一切锁;
04.当一个线程执行完它的run()方法,它将不再是一个执行线程(execution thread)!!
备注:当一个线程执行完以后,不可以再调用它的start()方法(使它重新成为执行线程);
05.线程状态:
New:线程实例已被实例化,但是还没有调用start()方法(NotAlive);
Runnable:可以随时被运行(但还没有运行)(Alive);
Running:线程正在运行;
Waiting/blocked/sleeping:线程时活动的,但是没有运行;
Dead:结束
06.JAVA中所有类都自动继承了如下三个方法:
public final void wait()
public final void notify()
public final void notifyAll()
07 . 线程调用sleep()方法后并不会立刻再回到运行中(running)状态,只会回到runnable(等待执行)状态;另外注意:因为sleep()是一个静态方法,所以不会出现一个线程调用另一个线程的sleep()方法的情况;
08.实例化一个线程
首先,你要实例化你的Runnalbe类:MyRunnable r = new MyRunnable();
然后,创建一个Thread类的实例(somebody has to run your job…):
Thread t = new Thread(r);//传递你的Runnable对象到Thread
如果你使用不带参数的构造函数去创建Thread对象(如Thread t = newThread()),当进程运行的时候它将直接调用它自己的(默认)run()方法;但是当你把runnable对象作为参数传递给带参数的线程创建构造函数时,它将运行你自己定义的而不是系统默认的run()方法。
09.每一个JAVA对象都内嵌一个锁(LOCK),但是该锁只是在该对象有同步的方法(synchronizedmethod)代码时才开始活动;备注:(1)不是类中所有的方法都必须是同步的(synchronized);(2)在一个类中可以同时存在两个同步方法,但是在同一时刻一个线程只能访问其中的一个同步方法;(3)一个线程可同时访问多个不同的锁(Lock,来自不同的对象);(4)可以只把方法中的一个模块标记为同步的(synchronized);
10 . wait(), notify(), andnotifyAll()方法的调用必须来自于同步上下文(环境)(synchronizedcontext);一个线程在没有拥有对象的锁(lock)之前不能调用对象的这些方法;
11 . 一个线程为了(能)调用wait()或thread()方法,它必须拥有对象的锁。当线程等待时,它暂时释放锁给其他线程使用,但它必须在再次得到它时才能继续执行;一般语法(形式)如下:
synchronized(anotherObject) { // this has the lock onanotherObject(拥有对象锁)
try {
anotherObject.wait();
// the thread releases the lock andwaits
// To continue, the thread needs thelock,
// so it may be blocked until it getsit.
} catch(InterruptedException e){}
}
前面的代码在对象“anotherObject”调用notify()方法之前一直处于等待状态;
//The preceding code waits untilnotify() is called on anotherObject.
synchronized(this) {
notify();
}
12 . 方法可以同步(synchronized),变量(variable)不可以;
13 . 在同一个线程上执行两次start()方法会出现运行时错误而不是编译错误;同理,如果调用wait()方法的线程若没有获得对象的锁也会出现运行错误而不是编译错误;
14 . 因为类Thread实现了Runnable,所以如下的代码是正确的:
MyThread t = new MyThread();
Thread x = new Thread(t);
x.start();
15 . Sleep()方法必须包含在Try…Catch语句中;或者调用它的(用户定义的)方法必须仍出InterruptedException
16 . 静态方法可以被同步;
17 . 切记:一般情况下背景线程应该设置最低优先级(1或Thread.MIN_PRIORITY);
浙公网安备 33010602011771号