总结---多线程(2)

线程的优先级:  

线程的优先级是系统在给线程分配CPU时间片的概率,当多个线程处于执行状态等待CPU分配时间片的时候,优先级越高他获得CPU时间片的几率就越大,反之就越小。线程的优先级在1-10之间,默认为5。MAX_PRIORITY线程可以具有的最高优先级。MIN_PRIORITY线程可以具有的最低优先级。NORM_PRIORITY分配给线程的默认优先级。我们可以使用getPriority()和setPriority(int newPriority) 获得和更改线程的优先级。

线程的同步:

因为同一进程的多个线程共享同一片存储空间, 所以在多个线程同时访问同一个资源时会发生冲突,对资源造成破坏,线程同步就避免了这个问题。

同步的前提:同步需要两个或者两个以上的线程。多个线程使用的是同一个锁。未满足这两个条件,不能称其为同步。
实现线程同步的两种方法:

1. synchronized 方法:在方法中加上synchronized关键字来声明同步。例:
private synchronized void show()

synchronized 方法控制对类成员变量的访问,可以将其看做一把锁,每个synchronized 方法都必须获得这把锁方能执行,当一个线程进入方法后,独占该锁,其他的线程进入阻塞状态,只有当方法返回后独占锁的线程才会放开锁,其他阻塞的线程才有可能获得这把锁,这就保证了被声明为synchronized的方法最多只有一个处于可执行状态,从而避免了访问冲突。
2. synchronized 块:通过 synchronized关键字来声明synchronized 块。例:
synchronized(Object) { 需要控制的代码 }
使用synchronized 块,必须声明在哪一个对象的操作上同步,即获取哪一个对象的锁。它的相对于synchronized 方法的优点是同步方法只能有一个锁即this,而synchronized 块可以指定多个锁,灵活性高。具体实现同步的机制与使用synchronized 方法类似。

死锁:

虽然线程的同步解决了数据资源安全性的问题,但是比较消耗资源。假设有两个线程,分别代表两个饥饿的人,他们必须共享刀叉并轮流吃饭。他们都需要获得两个锁:共享刀和共享叉的锁。假如线程 "A" 获得了刀,而线程 "B" 获得了叉。线程 A 就会进入阻塞状态来等待获得叉,而线程 B 则阻塞来等待 A 所拥有的刀。在当两个线程被阻塞,每个线程在等待另一个不可能释放的线程时,就会产生死锁,程序死掉,死锁在java中很复杂的,难于发现不易解决。

线程间的通信:

Java提供了3个非常重要的方法来巧妙地解决线程间的通信问题。这3个方法分别是:wait()、notify()和notifyAll()。它们都是Object类的一部分而不像sleep()那样属于Thread类的一部分。(为什么呢? 1,这些方法存在与同步中。2,使用这些方法时必须要标识所属的同步的锁。 3,锁可以是任意对象,所以任意对象调用的方法一定定义Object类中。

wait(),sleep()有什么区别? wait():释放资源,释放锁。 sleep():释放资源,不释放锁。)

虽然所有的类都默认拥有这3个方法,但是只有在synchronized关键字作用的范围内,并且是同一个同步问题中配合使用这3个方法时才有实际的意义。调用wait()方法可以使调用该方法的线程释放共享资源的锁,然后从运行态退出,进入等待队列,直到被再次唤醒。而调用notify()方法可以唤醒等待队列中第一个等待同一共享资源的线程,并使该线程退出等待队列,进入可运行态。调用notifyAll()方法可以使所有正在等待队列中等待同一共享资源的线程从等待状态退出,进入可运行状态,线程池中的第一个等待的线程先获得运行。显然,利用这些方法就不必再循环检测共享资源的状态,而是在需要的时候直接唤醒等待队列中的线程就可以了。这样不但节省了宝贵的CPU资源,也提高了程序的效率。


守护线程:

守护线程是一类特殊的线程,当一个应用程序的所有非守护线程终止运行时,即使仍然有守护线程在运行,应用程序也将终止,反之,只要有一个非守护线程在运行,应用程序就不会终止。可以通过调用方法 isDaemon() 来判断一个线程是否是守护线程,也可以调用方法 setDaemon(boolean b) 来将一个线程设为守护线程。


中断线程:

1.1.定义循环结束标记
l因为线程运行代码一般都是循环,只要控制了循环就可以控制线程的结束。
2.2.使用interrupt(中断)方法。
l该方法是结束线程的冻结状态,使线程回到运行状态中来。但是如果线程在调用Object类的wait()、wait(long)或wait(long,int)方法,或者该类的join(),join(long),join(long,int)或sleep(long),sleep(long,int)方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/liuxiaolei7676/archive/2010/04/03/5448456.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值