黑马程序员_day15_多线程3

来源:互联网 发布:linux apache 加载php 编辑:程序博客网 时间:2024/05/29 12:34

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

JDK1.5后出现的新的接口和类:

Lock:比同步函数和同步代码块要好一些。

分析发现:

同步函数还是同步代码块所做的都是隐式的锁操作。

同步函数或者同步代码块使用的锁和监视器是同一个。

Lock接口:是将锁进行单独对象的封装。而且提供了对锁对象很多功能。

比如:lock()获取锁,unlock()释放锁。

Lock对锁的操作都是显示操作。

所以它的出现要比同步函数或者同步代码块明确的多。

更符合面向对象思想。 

简单一句话:Lock接口的出现替代同步。

原来在同步中,锁和监视器是同一个对象。

现在,升级后,锁是一个单独的对象。

而且将监视器的方法也单独封装到了一个对象中。这个对象就是升级后Condition.

升级后,都进行了单独的封装。

锁被封装成了Lock对象。

监视器方法都被封装到了Condition对象(监视器对象)中。

说白了,Lock替代了同步,Condition替代了Object中的监视器方法。

Condition中提供了监视器的方法:awati().signal(),signalAll();

同一个锁,while的标记判断,notifyAll的全部唤醒。 

这种解决方案效率低,因为还会唤醒本方。

有了新特性LockCondition。就可以解决这个问题了。

之前是有两个锁嵌套,容易死锁,

现在方案是只有锁,但是锁上可以加入多个监视器。

一个监视生产者,一个监视消费者。

如何让锁和监视器产生联系呢?

直接通过Lock接口中的newCondition()方法就可以获取到能绑定到该Lock对象的上的监视器对象Condition

//创建一个锁对象。

private final Lock lock = new ReentrantLock();

//创建一个生产者的监视器。

private Condition producer_con = lock.newCondition();

//创建一个消费者监视器。

private Condition consumer_con = lock.newCondition();

public  void set(String name)//  

{

//获取锁。

lock.lock();

try

{

while(flag)

try{producer_con.await();}catch(InterruptedException e){}//t0(-->wait) t1()

-----------------------

flag = true;

consumer_con.signal();

}

finally

{

//释放锁。

lock.unlock();

}

}

public  void get()

{

lock.lock();

try

{

while(!flag)

try{consumer_con.await();}catch(InterruptedException e){}//t2  t3

------------------------------------

flag = false;

producer_con.signal();

}

finally

{

lock.unlock();

}

}

停止线程:

1stop():过时。

2run方法结束,当线程没有了要运行的代码线程就结束了。意味着任务结束,线程消失。

一般情况下run方法中都会定义循环。

开启新的执行路径就是为了对多次的运算和其他代码进行同时的执行。

public void run()

{

System.out.println("ok");

}//这种线程任务是毫无意义的,根本就不需要多线程执行。

开启多线程会同时并重复做很多运算。

结束run方法,只要控制住run中的循环即可。

控制循环通常需要通过标记来完成。

private boolean flag = true;

while(true)

如果读不到标记怎么办?

比如在任务中让线程处于了冻结状态。

释放了执行资格,无法执行标记,run方法没结束,线程也无法结束。

Thread类中有一个interupt方法。可以将线程的冻结状态清除

让线程恢复到具备执行资格。

Join方法

d1.start();

try{d1.join();}catch(InterruptedException e){}只要是线程出现冻结状态的方法,都会出现中断异常。当主线程执行到join方法时,即要交出执行权 处于冻结状态 直至的d1线程结束。

d2.start();

Thread.yield();释放执行权。

d1.setPriority(Thread.MAX_PRIORITY);设置线程优先级。MAX_PRIORITY10.

wait()sleep()方法的异同点:

两个方法都可以让线程处于冻结状态。

sleep()必须指定时间,wait是可以指定时间,也可以不指定。

synchronized(obj)

{

sleep();

}

sleep():会释放执行权,不会释放锁。因为会自动醒,所以不用释放锁。

wait():会释放执行权,会释放锁。被wait的方法是要被另外一个线程来唤醒。

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

原创粉丝点击