Java多线程编程
来源:互联网 发布:数据统计工作总结 编辑:程序博客网 时间:2024/05/22 04:49
Java的线程类可以有两个选择:一个是扩展Thread类,然后重装它的run方法;另一个是实现Runnable类,实现它的的run方法,然后用new Thread(实现Runnable的类)方法生成对应的线程对象。关于该线程的操作在run方法中实现。
线程的运行是调用它的start方法,它会调用run方法,记住不是直接调用run方法。
产生线程后,接下来是线程的控制和通信了。
在讲这个之前先讲一下线程的状态。线程有5个状态:开始、就绪、运行、阻塞、结束。当一个线程开始之后处于就绪状态,此时的线程是可运行的,只要CPU给它分配了时间它就可以运行;一个线程获得了CPU时间后就开始运行,此时是处于运行状态,直到运行结束后转到结束状态,或者因为自己休眠让出CPU时间、等待其他线程的结果、等待IO操作等而转到阻塞状态;处于阻塞状态的线程必须在其被唤醒之后才能转到就绪状态等待分配CPU时间。关于这些内容的深入可以参考一下操作系统这部分的知识。
可以使用Thread类的sleep(long mills)让该线程休眠,使用yield让该线程让出CPU时间给其他线程使用,使用thread2.join()方法让调用该方法的线程处于阻塞状态,等待thread2线程直到它运行完后才处于就绪状态。关于通信的方法还有wait、notify、notifyAll等,wait不用等到线程结束才可以唤醒,只要被等待的线程满足某个条件后调用notify或notifyAll就可以唤醒等待它的某个线程或所有线程。结合以上各种方法可以实现线程间的通信协作。
因为资源有限,如果多个线程使用同样的资源,可能产生冲突,即所谓的竞争。此时需要进行同步,即对资源进行加锁。可以使用synchronized关键字对要使用的资源进行同步,有两种使用方法:一个是对资源使用的临界区,即对资源的操作用一个方法实现,将该方法申明为synchronize;一个是用synchronize(expr){},expr必须可以求出对象的引用,一般是要使用的资源,对资源的操作在{}的代码段里面。
好了,既然线程可以对资源进行加锁,那么就可能存在死锁的情况。比如线程1先锁了资源A,线程2先锁了资源B,然后线程1接着锁资源B,线程2接着锁资源A。因为线程2已经锁了资源B,所以线程1得等线程2释放资源B才能运行,同样线程2得等线程1释放资源A才能运行,这样就形成了1等2,2又等1的情况,即死锁。
解决死锁的方法是用资源排序的技术,即给每一个需要锁定的对象定义一个顺序,确保每个线程都按这个顺序来锁定对象。对上面的例子,假设按资源A、资源B的顺序排序这两个对象,采用这种技术,那么线程2必须先锁定资源A,然后才能锁定资源B。一旦线程1锁定了资源A,线程2只能等待对资源A的加锁,所以线程1就能锁定资源B,不会发生死锁现象。
关于Java的多线程编程就学了这些内容,如果还有的请大家补充,一起交流学习。
- 【JAVA】JAVA多线程编程
- 【java】:java多线程编程
- Java多线程编程初步
- Java 多线程编程
- Java多线程编程详解
- Java多线程编程经验谈
- Java 多线程编程
- Java多线程编程详解
- Java多线程编程详解
- Java 5.0多线程编程
- Java 5.0多线程编程
- Java 5.0多线程编程
- Java多线程编程详解
- Java多线程编程详解
- Java 5.0多线程编程
- Java多线程编程详解
- java基础教程-多线程编程
- Java多线程编程详解
- 向窗口传递多个参数
- 输入一行字符,统计其中的单词的个数.各单词之间用空格分隔
- Java集合架构(二、Map、Collections、Arrays)
- Web网站的设计、管理与维护
- DOS命令大全(很全)(转)
- Java多线程编程
- 程序员的七个好习惯
- JSP乱码终极解决(实用)(转)
- C++中的四种类型转换
- Jsp实现树形结构(转)
- Js日期验证(转)
- jQuery表单常用操作收藏(转)
- ftrace介绍
- 九九乘法表