`
maosuhan
  • 浏览: 109759 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

java线程的学习【总结】

    博客分类:
  • java
阅读更多
一般可以在同一时间内执行多个程序的操作系统都有进程的概念.一个进程就是一个执行中的程序,而每一个进程都有自己独立的一块内存空间,一组系统资源.在进程概念中,每一个进程的内部数据和状态都是完全独立的.因此可以想像创建并执行一个进程的系统开像是比较大的,所以线程出现了。



线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制;但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈.所以系统在产生一个线程,或者在各个线程之间切换时,负担要比进程小的多,正因如此,线程也被称为轻负荷进程(light-weight process).一个进程中可以包含多个线程.



生命周期

线程有创建,可运行,运行中,阻塞,死亡五中状态.一个具有生命的线程,总是处于这五种状态之一:

1.创建状态

使用new运算符创建一个线程后,该线程仅仅是一个空对象,系统没有分配资源,称该线程处于创建状态(new thread)

2.可运行状态

使用start()方法启动一个线程后,系统为该线程分配了除CPU外的所需资源,使该线程处于可运行状态(Runnable)

3.运行中状态

Java运行系统通过调度选中一个Runnable的线程,使其占有CPU并转为运行中状态(Running).此时,系统真正执行线程的run()方法.

4.阻塞状态

一个正在运行的线程因某种原因不能继续运行时,进入阻塞状态(Blocked)

5.死亡状态

线程结束后是死亡状态(Dead)







线程是可以被组织的,java中存在线程组的概念,每个线程都是一个线程组的成员,线程组把多个线程集成为一个对象,通过线程组可以同时对其中的多个线程进行操作,如启动一个线程组的所有线程等.

你可以利用这两个方法很好的控制线程的执行流程,当线程调用wait方法后,线程将被挂起,直到被另一线程唤醒(notify)或则是如果wait方法指定有时间得话,在没有被唤醒的情况下,指定时间时间过后也将自动被唤醒。但是要注意一定,被唤醒并不是指马上执行,而是从组塞状态变为可运行状态,其是否运行还要看cpu的调度。



在代码中写
synchronized(lock)

{

/*

执行一段任务

*/

lock.wait();

}



另一段代码中

synchronized(lock)

{

/*

完成一段任务

*/

lock.notify();

}



可形成线程安全的协作







单实例多线程

调度者线程类所担负的责任如其名字,该类的责任是调度线程,只需要利用自己的属性完成自己的责任。所以该类是承担了责任的,并且该类的责任又集中到唯一的单体对象中。
而其他对象又依赖于该特定对象所承担的责任,我们就需要得到该特定对象。那该类就是一个单例模式的实现了。
1、多线程并不共享局部变量.所以我们要尽可能的在servlet中使用局部变量。
2、ServletContext:(线程是不安全的)、HttpSession:(线程是不安全的,多浏览器打开)、ServletRequest:(线程是安全的)
3、不要在Servlet中创建自己的线程来完成某个功能。
4、服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下此请求。这样就造成并发访问的问题。



关于锁wait和notify
在方法前加锁就相当于是对这个对象本身加锁
public synchronized void setCount(int count) { this.count = count; } 

等同于
public void setCount(int count) {
    synchronized(this) { // 在此获得this锁
         this.count = count;
    } // 在此释放this锁
} 

调用一个Object的wait与notify/notifyAll的时候,必须保证调用代码对该Object是同步的,也就是说必须在作用等同于 synchronized(obj){......}的内部才能够去调用obj的wait与notify/notifyAll三个方法,否则就会报错。
  无论是线程的sleep()还是suspend()都不可能自己被调用的时候解除锁 定,他们都霸占着正在使用的对象锁不放.
    而wait却可以,它可以让同步方法或者同步块暂时放弃对象锁,而将它暂时让给其它需要对象锁的人。 wait()允许我们将线程置入“睡眠”状态",也就是说,wait也是让当前线程阻塞的。
  好,那怎么把对象锁收回来呢?
    第一种方法,限定借出去的时间.在wait()中设置参数,比如wait(1000),以毫秒为单位,就表明我只借出去1秒中,一秒钟之后,我自动收回.
    第二种方法,notify,让借出去的人通知我,他用完了,要还给我了.这时,我马上就收回来.哎,假如我设了1小时之后收回,别人只用了半小时就完了,那怎么办呢?靠!当然用完了就收回了,还管我设的是多长时间啊.
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics