黑马程序员_多线程

来源:互联网 发布:淘宝网一元秒杀在哪里 编辑:程序博客网 时间:2024/06/11 02:08

 

 

 ------- android培训java培训、期待与您交流! ----------

 

           获得一个线程有两种方式,继承Thread类或者实现Runnable接口,然后new Thread(实现Runnable接口的对象);

线程的启动是直接调用start()方法,不能直接调用run()方法,这样不会创建一个新的线程,只是简单的在当前线程中执

行了run()方法,然后结束当前线程。

        

              多线程同步需要用到的关键字是synchronized;同步方法和同步块的共同的锁是 this;静态同步方法和同步块的共同的锁

是使用的锁是  类.class。线程间通讯,其实就是多个线程操作同一个对象。

 

线程中常用的方法:        

thread1.join()的作用是把thread1所对应的线程合并到调用thread1.join()的线程中。join()也可以理解为抢占CPU的执行权,其他

线程碰到jonin()后将会等待,直到线程结束。

yield()方法可以让当前正在运行的线程对象临时暂停,让别的线程运行。

sleep(...)方法可以让当前正在运行的线程进入睡眠状态。

wait():释放资源,释放锁

sleep():释放资源,不释放锁

notify()往往幻想的是线程池中的第一个等待的线程

当出现多个生产者和消费者的时候,要用notifyAll()来唤醒等待的线程

 

线程中的死锁:

当两个或多个线程持有的锁不相同是就好发生死锁现象,例如:

class Test implements Runnable{

 private boolean flag=false;
 
 public Test(boolean flag){
  

        this.flag=flag;
 }
 
 public void run(){
 

   if(flag){
           synchronized(MyLock.locka){
                system.out.println("if locka");
           synchronized(MyLock.lockb){
                system.out.println("if lockb");
    }
   }
  }else{
   synchronized(MyLock.lockb){
              system.out.println("else lockb");
    synchronized(MyLock.locka){
               system.out.println("else locka");
    }
   }
  }
 }
}

class MyLock{
         static Object locka=new Object();
         static Object lockb=new Object();
}

 

public class Threadload {

 /**
  * @param args
  */
 public static void main(String[] args) {
        Thread t1=new Thread(new Test(true));
        Thread t2=new Thread(new Test(false));
         t1.start();
         t2.start();
 }

}

        因此我们在编写程序的时候应该避免使用这种现象,必须使用同一把锁才能保证线程之间的同步。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

   

 ------- android培训java培训、期待与您交流! ----------  

详细请查看:http://edu.csdn.net/heima/

原创粉丝点击