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^)/
原创粉丝点击