多线程在程序中充当着一个非常重要的角色,它能够保证网络程序中多用户的处理。
那么我们应该如何去正确调度线程呢
1.对象锁
多线程在程序中是会争夺cpu的,所以适当时期需要用到对象锁。
在进行线程在同一时间只保证一个线程访问方法或变量。比如售票系统,在保证多窗口售票的同时,要保证票数的正确性,则要使用对象锁。
对象锁的作用:增加并发性。
对象锁中两个重要的调度方法:wait();notify();用于控制线程状态。
注意:wait();方法只能在对象锁的时候使用。wait();调用后会返回对象锁。sleep();不能在对象锁中使用,该方法不会返回对象锁。
以一个小程序来举例对象锁的使用:
多线程与栈的结合:
client类:
public class client{
public static void main(String[] args){
Mystock stock =new Mystock();
ThreadPush t1=new ThreadPush(stock);//出栈类
ThreadPop t2=new ThreadPop(stock);//进栈类
t1.start();
t2.start();
}
}
Mystock类:
public class Mystock{
char data[]=new char[6];
int idx=0;
private boolean isEmpty=true;
public synchronized void push(char c){//添加对象锁
if(!isEmpty){//如果栈不为空,调用wait(),等待出栈。
try{
wait();
}catch(InterruptedException e){
}
}
System.out.println("push:"+c);
data[0]=c;
isEmpty=!isEmpty;
notify();//唤醒pop(),进行出栈
}
public synchronized char pop() {//添加对象锁
if (isEmpty) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("pop:" + data[0]);
isEmpty = !isEmpty;
notify();
return data[0];
}
}
public class ThreadPop extends Thread {
private Mystock stock = null;
public ThreadPop(Mystock stock) {
this.stock = stock;
}
public void run() {
for (int i = 97; i < 103; i++) {
stock.pop();
}
}
}
public class ThreadPush extends Thread {
private Mystock stock = null;
public ThreadPush(Mystock stock) {
this.stock = stock;
}
public void run() {
for (int i = 97; i < 103; i++) {
stock.push((char) i);
}
}
}
这样程序运行的输出结果为:
push:a
pop:a
push:b
pop:b
push:c
pop:c
push:d
pop:d
push:e
pop:e
push:f
pop:f
这就是wait(),notify(),对象锁的作用