多线程

查看: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);

 

posted on 2017-05-08 16:35  全力以赴002  阅读(102)  评论(0)    收藏  举报

导航