网站首页 新闻首页 网页设计图形动画软件编程网站开发办公软件操作系统数据库网络技术认证考试范文资料黑客攻防 书籍教程 进入论坛

java 多线程 专题

http://www.diybl.com/ 2008-3-8  网络 点击:  [ 评论 ]
文章搜索:    【点击打包该文章】

  
CoreJava多线程
线程的概念:
线程指进程中的一个执行流程,一个进程可以包含多个线程。
每一个进程都独享一块内存空间。每个进程都需要操作系统为其分配独立的内存地址,而同一进程中的多个线程在同一块地址空间工作,他们共享一块内存和资源。
java中有两中方法创建一个多线程类:
1、继承java.lang.Thread类,覆盖Thread类的run()方法
2、实现Runnable接口,实现Runnable接口的run()方法。推荐使用第二种,因为第二种更加的灵活。


每次调用java.exe的时候操作系统都会启动一个JVM进程,当启动JVM的时候,JVM都会创建一个主线程,改线程从程序入口main方法开始执行,这个线程的名字就叫main,可以在main方法中打印线程名:
System.out.println( Thread.currentThread().getName())来测试。

注意:每次程序运行的时候除了自定义的线程外还有一个main线程。
 
线程的调度
sleep(xxx),指当前运行的线程睡眠xxx秒,睡眠的时候当前线程会交出CPU,但是不会交出对象的锁!

yield(),指当前运行的线程交出CPU,给其他线程运行的机会。


join()
,指将CPU交给调用join()方法的线程对象,直到该线程运行结束。
 
线程的各种状态
新建状态(new) //线程刚被创建出来
        Runnable r = new ThreadTest2();
        Thread t1 = new Thread(r,"t1");//创建线程t1 线程处在new状态

就绪状态(Runnable)
        t1.start();//启动线程t1,这时候他处在Runnable状态,等待CPU的调度。

运行状态(Running)
       如果处在Runnable状态的线程,被调度获得cpu,那么他就处在Running状态

阻塞状态(Blocked)
       如果Running中的线程调用sleep(),yield()或者程序运行到等待输入的方法时,他就处在阻塞状态。

       如果执行到了wait()语句,释放锁标记,并进入等待池中。直到某个线程调用notifyAll()方法将其从对象的等待池转进锁池,等待锁标记!

死亡状态(Dead)
       线程执行完毕,就处于死亡状态。

 
线程安全的控制
关键就是使用:synchronized 、 wait() 和 notifyAll()   
    当多个线程试图同时修改某个实例的内容时,就由有可能会造成冲突。
    为了解决这种冲突,使用synchronized关键字来对该共同访问的实例“加锁”。对同一个实例来说,任意时刻只能有一个synchronized方法在执行。当一个方法正在执行某个synchronized方法时,其他线程如果想要执行这个实例的任意一个synchronized方法,都必须等待当前执行synchronized方法的线程退出此方法后,才能依次执行。
    注意!非synchronized方法不受影响,不管当前有没有执行synchronized方法,非synchronized方法都可以被多个线程同时执行。
      每一个对象都有一个锁标记,它标记是否有线程在使用该对象。对象有一个等待池,一个锁池
      对同一个对象的不同方法使用synchronized,他们判断的是同一个锁标记,就是对象的本身(this)的锁标记。
      一个线程占用了对象的锁标记,其余的线程就得在该对象锁池中等待当前线程释放对象的锁。

       Object的方法;wait()和notify()/notifyAll()实现线程之间的通讯。
       wait()会使线程对象放弃CPU,并释放对象的锁。JVM会将该线程放到该对象的等待池中,等待其他线程将其唤醒this.notifyAll(),这时所有等待池中的线程都进入对象的锁池,等候锁标记

wait()产生的效果:
1.让当前正在执行的线程释放掉a的锁标记。
2.让当前正在执行的线程进入a对象的等待池等待。
    notify()会唤醒在对象的等待池中等待的一个线程,JVM从对象等待池中随机选择一个线程,把他转换到对象的锁池中,所以一般都用notifyAll()把等待池中所有的线程对象都转入到对象的锁池中。
调用wait()时,该线程必须占用了某个锁标记。也就是必须出现在某一个synchronized的代码块中,并且调用wait()方法的对象必须和synchronized中声明的对象是同一个对象。
例如:
//synchronized修饰的方法就表示使用当前对象的锁标记
public synchronized void f(){
    …
   this.wait();
    …
}

文章整理:DIY部落 http://www.diybl.com (本站)   【点击打包该文章】
如果图片或页面不能正常显示请点击这里 站内搜索:   

文章评论

请您留言

 

最新新闻