Java SE 第九十七~一百零五讲 线程与进程

1.Java中如果我们自己没有产生线程,那么系统就会给我产生一个线程(主线程,main方法就在主线程上运行), 我们的程序都是由线程来执行的.

2. 进程:执行中的程序(程序是静态的,进程是动态的)

3.线程的实现:

①继承Thread类并重写run方法

②通过定义实现Runnable接口的类进而实现run方法.

3.将我们希望线程执行的代码放到run方法中,然后通过start方法来启动线程, start方法首先为线程的执行准备好系统资源,然后再去调用run()方法.当某类继承了Thread后,这个类就叫做一个线程类.

4. 一个进程至少包含一个线程.

5. 对于单核cpu来说,某一个时刻只能有一个线程在执行(微观串行),从宏观角度来看,多个线程在同时执行(宏观并行)

10. 对于双核或双核以上的cpu来说,可以真正做到微观并行.

11.

①Thread类也实现了Runnable接口, 因此实现了Runnable接口中的run方法.

②当生成一个线程对象时,如果没有为线程指定名字,那么线程对象的名字将使用如下形式:Thread-number,该number将是自动增加的,并被所有的Thread对象所共享(因为它是static的成员变量)

③当使用第一种方式来生成线程对象时,我们需要重写run方法,因为Thread类的run方法此时什么都不做.

④当使用第二种方式时,我们需要实现Runnable接口的run方法,然后使用new Thread(new MyThread())(假如MyThread已经实现了Runnable接口)来生成线程对象,这时的线程对象的run方法或调用MyThread类的run方法,这样我们自己编写的run方法就执行了.

12.总结:

①两种方法均需执行线程的start方法为线程分配必须的系统资源,跳读线程运行执行线程的run方法.

②在具体应用中,采用哪种方法来构造线程体视情况而定. 通常, 当一个线程已经继承了另外一个类是,就应该用第二种方法来构造, 即实现Runnable接口.

③线程的消亡不能通过调用一个stop()命令, 而是让run()方法自然结束.

13.关于成员变量与局部变量:如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时, 他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程).

14.如果一个变量时局部变量, 那么每个线程都会有一个该局部变量的拷贝, 一个线程对该局部变量的改变时不会影响其他线程的.

15.停止线程的方式:不能使用Thread类的stop方法来终止线程的执行,循环每次检查该变量, 在run方法中是一个循环, 循环每次检查该变量,如果瞒住条件则继续执行,否则跳出循环,线程结束.

16.不能依靠线程的优先级来决定线程的执行顺序.

17.synchronized关键字: 当synchronized修饰一个方法时,该方法叫做同步方法.

18.Java中的每个对象都有一个锁(Lock)或者叫做监视器(monitor),当访问某个对象的synchronized方法时, 表示将该对象上锁,此时其他任何线程都无法再去访问该synchronized方法了,知道之前的那个线程执行方法完毕后(或者抛出了异常), 那么该对象的锁释放掉, 其他的线程才有可能再去访问该syncronized 方法.

19.如果一个对象有多个synchronized方法,某一时刻某个线程已经进入到了某个synchronized方法, 那么在该方法没有执行完毕前, 其他线程是无法访问该对象的任何synchronized方法的.

20.如果某个synhronized方法是static的, 那么当线程访问该方法时, 它的锁并不是synchronized方法所在的的对象, 二十synchronized方法所在的对象所对应的Class对对象, 因此当线程分别访问同一个类的两个对象的两个static, synchronized方法时, 他们的执行顺序也是顺序的,也就是说一个线程先去执行方法, 执行完毕后另一个线程才开始执行.

21.synchronized块, 写法:

synchronized(object)

{

 

 

}

表示线程在执行的时候会对object对象上锁.

22.synchronized 方法是一种粗粒度的并发控制, 某一时刻,只能有一个synchronized方法; synchronized块则是一种细粒度的并发控制, 只会将块中的代码同步,位于方法内,synchronized块之外的代码是可以被多个线程同时访问到的.

23.死锁(deadlock):

24.wait与notify方法都是定义在Object类中, 而且是final的, 因此会被所以的Java类所继承并且无法重写. 这两个方法要求在调用时线程应该已经获得了对象的锁, 因此对这两个方法的调用需要放在synchronized方法或块中. 当线程执行了wait方法时, 它会释放掉对象的锁.

25.另一会导致线程暂停的方法就是Thread类的sleep方法, 它会导致线程睡眠指定的毫秒数, 但线程在睡眠的过程中时不会释放掉对象的锁的.

26.线程组:

27.Timer

posted @ 2011-03-19 19:06  donaldjohn  阅读(202)  评论(0编辑  收藏  举报