上一篇我们讲了一下多线程的概念。这一篇,我们用一些比较简单的例子,来看看多线程在代码层次上的实现过程。我们现在和之后将的所有多线程,都将采用实现Runnable 接口的方式,因为我比较喜欢这个方式。。。我们来用两种方式进行同步锁,这两个例子都是网上随便找的,这里就是做一个总结。
一:synchronized
public class PickRunnableimplements Runnable{
private Integertickettotal =100;
@Override
public void run() {
while (true) {
synchronized (this) {
if (tickettotal >0) {
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"售出了第" + (tickettotal--) +"张票");
}
}
}
}
}
二:lock()和unlock()
// 定义锁
private Locklock =new ReentrantLock();
@Override
public void run() {
while (true) {
lock.lock();
if (tickettotal >0) {
try {
Thread.sleep(1000);
}catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() +"售出了第" + (tickettotal--) +"张票");
}
lock.unlock();
}
}
三:在主方法中调用
PickRunnable pickRunnable =new PickRunnable();
Thread t1 =new Thread(pickRunnable,"第一售票厅");
Thread t2 =new Thread(pickRunnable,"第二售票厅");
Thread t3 =new Thread(pickRunnable,"第三售票厅");
t1.start();
t2.start();
t3.start();
这里可以看到我们的线程里面,在run方法中,都加了一个while(true),为什么呢,其实这个while不是强制要加的,只不过,run方法本身不会自己循环,只执行一次,所以需要循环的,必须要加个while,但是如果只要求执行一次的,可以不加。
还要特别注意synchronized是非公平锁,随机获得锁,不一会会按照执行顺序执行。lock()和unlock()是公平锁,
网友评论