黑马程序员——多线程
来源:互联网 发布:陈赫淘宝店叫什么 编辑:程序博客网 时间:2024/05/17 22:11
---------------------- ASP.Net+Android+IO开发S、.Net培训、期待与您交流! ----------------------
线程
一个运行的程序就是一个进程,例如JVM一启动就有个java.exe的进程,一个进程里至少有一个线程,线程是一个独立的控制单元,控制着进程的运行。JVM启动就有一个叫main的线程,叫主线程。Java中对线程进行描叙的类有Thread类。
线程的创建
//继承Thread来创建线程,此时有三个进程,主线程和创建的两个线程class Thread1 extends { public void run(){ for(int x=0,x<10,x++){ System.out.println(x); } }}class ThreadTest{ public static void main(String[] args){ new Thread1().start; new Thread1().start;}}//这种继承方式创建线程后,Thread1就无法再去继承其他类了,这是一个局限性//上面创建的两个线程都是分别独立运行的,如果要对共享数据进行操作,这种继承Thread类的方式就行不通了
//实现Runnable接口来创建线程//通过实现Runnable接口可以实现多共享数据的多线程操作,同时实现它的子类也可以同时继承其他类class Thread1 implements Runnable { public void run(){ for(int x=0,x<10,x++){ System.out.println(x); } }}class ThreadTest{ public static void main(String[] args){ new Thread(new Thread1).start; new Thread(new Thread1).start;}}/*因为是实现接口的方式创建线程,所以如果run()方法中有异常出现的话只能在方法内进行捕获处理,不能在方法上声明抛出*/
·同步问题
多个线程多共享数据操作时,一个线程对数据执行时可能会由于CPU的切换,另外一个线程进来,从而导致问题的发生。为了避免这种情况就要使用到同步代码块或同步函数。
synchronized(对象)
{
需要被同步的代码
}
同步函数是将synchronized关键字放在方法的返回值之前。同步代码块里的对象就是一个同步锁,持有这个锁的线程才能进去,当它处于wait状态时会释放锁。
同步函数的锁是this锁,静态函数的锁是它所在的类的Class对象。
·死锁问题
class Test implements Runnable{private boolean flag;Test(boolean flag){this.flag = flag;}public void run(){if(flag){while(true){synchronized(MyLock.locka){System.out.println(Thread.currentThread().getName()+"...if locka ");/*t1线程想要到同步代码块中执行,但是lockb锁在t2线程里,t2还没释放*/synchronized(MyLock.lockb){System.out.println(Thread.currentThread().getName()+"..if lockb");}}}}else{while(true){synchronized(MyLock.lockb){System.out.println(Thread.currentThread().getName()+"..else lockb");/*t2线程想要到同步代码块中执行,但是locka锁在t1线程里,t1也还没释放,彼此都拿着对方的锁,形成死锁*/synchronized(MyLock.locka){System.out.println(Thread.currentThread().getName()+".....else locka");}}}}}}class MyLock{static Object locka = new Object();static Object lockb = new Object();}class DeadLockTest{public static void main(String[] args) {Thread t1 = new Thread(new Test(true));Thread t2 = new Thread(new Test(false));t1.start();t2.start();}}
Lock接口
JDK1.5版本出现了更灵活的同步机制,就是使用Lock接口,它下面有个实现了Lock接口的ReentrantLock类,它有lock()和unlock()方法来替代同步代码块和同步函数,ReentrantLock里面的newCondition()方法创建出来的Condition对象里也拥有相应的线程通讯方法。它将Object中的wait(),notify(),notifyAll()方法都替换成Condition的await(),signal(),signalAll(),而且一个Lock锁上可以有多个Condition对象。
线程中的常见方法:
setDaemon(boolean):将线程标记为后台线程,后台线程和前台线程执行过程一样,但是当前台线程运行结束后,后台线程会自动结束。
join():等待该线程结束,当A线程执行到了B的join方法时,A就会处于冻结状态,当B运行结束后,A才具备运行资格,它可以完成对某个线程的临时加入执行。
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- 黑马程序员—多线程
- CentOS 双网卡双 IP 设置
- 转:从键盘输入三个整数,判断是否能构成三角形
- 单例模式的七种写法
- 三星note 3即将上市,九月让我们眼花缭乱的手机你更偏向于哪一款
- firefly的环境搭建(2013年9月25日最新,win下最详图文)
- 黑马程序员——多线程
- SOJ 题目分类
- @result 注解详解 跳转不同的action
- 使用C++模板的优点和缺点
- Twisted 阐述
- 即时通讯软件架构
- Firefly框架参考
- iOS开发 粗解UIDynamicAnimator
- 程序员应对面试的好东西