java中的多线程和锁
来源:互联网 发布:js 考试系统倒计时 编辑:程序博客网 时间:2024/05/16 09:12
当多个线程并发执行的时候,其实是对处理机资源的轮转调度,当然也包括其他的资源(如打印机等),这样就很容易的产生死锁(多个线程对同一资源的竞争,占有这个资源的线程又在等待其他的资源而不能得到)。因此,引入wait()/notify()(or notifyall())是很有必要的:当条件不满足的的时候(注意wait()方法要在synchronized块中),调用wait()方法解锁,使其进入“等待”状态,以便资源释放给其他线程使用;当有另外的“动作”导致系统状态发生改变(使刚刚的条件满足),对应的需要使用notify()或者notifyall()方法来唤醒等待的线程,将唤醒的线程放入就绪队列(notify()也需要放在synchronized块中,与wait()相对应,如果不用notify的话线程将永远处于等待状态导致死锁)。
具体应用如下:
管程(就绪状态)--> 运行 --> 完成;
管程(就绪状态)--> 运行 --> 等待(条件不满足)--> 唤醒(条件满足)--> 重新进入管程;
管程(就绪状态)--> 运行 --> 休眠(sleep)-- > 管程(休眠时间到);
管程(就绪状态)--> 运行 --> 管程(时间片到,但是还没有执行完毕);
管程(就绪状态)--> 运行 --> 阻塞(发出io操作请求)--> 管程(io操作请求结束);
下面是一个很好的例子(建一个很简单的线程池):(转自http://www.gbsou.com/2010/01/27/1971.html)
本示例程序由三个类构成,第一个是testthreadpool类,它是一个测试程序,用来模拟客户端的请求,当你运行它时,系统首先会显示线程池的初始化信息,然后提示你从键盘上输入字符串,并按下回车键,这时你会发现屏幕上显示信息,告诉你某个线程正在处理你的请求,如果你快速地输入一行行字符串,那么你会发现线程池中不断有线程被唤醒,来处理你的请求,在本例中,我创建了一个拥有10个线程的线程池,如果线程池中没有可用线程了,系统会提示你相应的警告信息,但如果你稍等片刻,那你会发现屏幕上会陆陆续续提示有线程进入了睡眠状态,这时你又可以发送新的请求了。
第二个类是threadpoolmanager类,顾名思义,它是一个用于管理线程池的类,它的主要职责是初始化线程池,并为客户端的请求分配不同的线程来进行处理,如果线程池满了,它会对你发出警告信息。
最后一个类是simplethread类,它是thread类的一个子类,它才真正对客户端的请求进行处理,simplethread在示例程序初始化时都处于睡眠状态,但如果它接受到了threadpoolmanager类发过来的调度信息,则会将自己唤醒,并对请求进行处理。
首先我们来看一下testthreadpool类的源码:
//testthreadpool.java
1 import java.io.*;
2
3
4 public class testthreadpool
5 {
6 public static void main(string[] args)
7 {
8 try{
9 bufferedreader br = new bufferedreader(new inputstreamreader(system.in));
10 string s;
11 threadpoolmanager manager = new threadpoolmanager(10);
12 while((s = br.readline()) != null)
13 {
14 manager.process(s);
15 }
16 }catch(ioexception e){}
17 }
18 }
由于此测试程序用到了输入输入类,因此第1行导入了java的基本io处理包,在第11行中,我们创建了一个名为manager的类,它给threadpoolmanager类的构造函数传递了一个值为10的参数,告诉threadpoolmanager类:我要一个有10个线程的池,给我创建一个吧!第12行至15行是一个无限循环,它用来等待用户的键入,并将键入的字符串保存在s变量中,并调用threadpoolmanager类的process方法来将这个请求进行处理。
下面我们再进一步跟踪到threadpoolmanager类中去,以下是它的源代码:
//threadpoolmanager.java
1 import java.util.*;
2
3
4 class threadpoolmanager
5 {
6
7 private int maxthread;
8 public vector vector;
9 public void setmaxthread(int threadcount)
10 {
11 maxthread = threadcount;
12 }
13
14 public threadpoolmanager(int threadcount)
15 {
16 setmaxthread(threadcount);
17 system.out.println("starting thread pool…");
18 vector = new vector();
19 for(int i = 1; i 关注我收藏该文与我联系
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
- java中的多线程和锁
- java中的多线程和锁
- java中的多线程和锁
- java中的线程和多线程
- Java多线程中的synchronized、volatile和无锁编程
- Java多线程中的long和double
- Java中的内存模型和多线程分析
- Java多线程中的wait和notifyAll
- java 多线程中的 wait 和 notify
- 浅谈Android和java中的多线程下载
- java多线程中的生产者和消费者队列
- 浅谈Android和java中的多线程下载
- Java多线程中的final和static
- java多线程中的wait()和notify()
- java和Android中的多线程操作
- JAVA多线程中的锁机制
- Java多线程编程-(12)-Java中的队列同步器AQS和ReentrantLock锁原理简要分析
- Java多线程编程-(14)-Java中的队列同步器AQS和ReentrantLock锁原理简要分析
- 分享几本JAVA入门书籍&&& Documentation
- 紫光华语的笔试题目(java)
- 【java】java异常处理
- C# VS Java
- .NET和java之争实没必要
- java中的多线程和锁
- Java程序员推荐的阅读书籍(学习JAVA者不看必后悔)
- Java程序设计资源推荐
- 【转】Java入门需掌握的30个基本概念
- 模拟弹子台球--java多线程应用
- [JAVA]java基础知识
- ibatis经验(Java版)
- JDBC与Java的数据类型映射关系
- Java反射机制