黑马程序员技术交流社区
标题:
求一个多线程关于锁的例子
[打印本页]
作者:
wanghe826
时间:
2014-5-8 17:22
标题:
求一个多线程关于锁的例子
本帖最后由 wanghe826 于 2014-5-8 18:01 编辑
对于多线程的同步我掌握的还不扎实,谁能提供一些代码例子给我看看,如果有注解就更好了,非常感谢!
作者:
skill20
时间:
2014-5-8 17:55
/*
需求:解决通信问题。对资源同步。
*/
import java.util.concurrent.locks.*;
class ThreadTest
{
public static void main(String[] args)
{
Res r = new Res();
Output op = new Output(r);
Input ip = new Input(r);
Thread t1 = new Thread(op);
Thread t3 = new Thread(ip);
Thread t2 = new Thread(op);
Thread t4 = new Thread(ip);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
class Res
{
private String name;
private int age;
boolean flag;
Lock lock = new ReentrantLock();//拿锁。
Condition notEmpty = lock.newCondition();//建立condition对象。因为一把锁可以有多个对象。
Condition notFull = lock.newCondition();
//这个锁是this锁。
/*public synchronized void set(String name,int age)
{
while(flag)
try
{
this.wait();//满足条件线程等待。
}
catch (Exception e)
{
System.out.println(e.toString());
}
this.name = name;
this.age = age;
flag = true;//改标记。
notifyAll();//唤醒所有线程。
}
public synchronized void get()
{
while(!flag)
try
{
this.wait();//满足条件线程等待。
}
catch (Exception e)
{
System.out.println(e.toString());
}
System.out.println(this.name + "" + this.age);
flag = false;//改标记
notifyAll();//唤醒所有线程。
}*/
public void set(String name, int age)
{
lock.lock();//先锁门。
try
{
while(flag)
notEmpty.await();//满足条件线程等待。
this.name = name;
this.age = age;
flag = true;//改标记。
notFull.signal();//唤醒对方线程。
}
catch (Exception e)
{
System.out.println(e.toString());
}
finally
{
lock.unlock();//开门。
}
}
public void get()
{
lock.lock();
try
{
while(!flag)
notFull.await();//满足条件线程等待。
System.out.println(Thread.currentThread() + this.name + ":::" + this.age);
flag = false;//改标记。
notEmpty.signal();//唤醒对方线程
}
catch (Exception e)
{
System.out.println(e.toString());
}
finally
{
lock.unlock();
}
}
}
class Input implements Runnable
{
private Res r;
Input(Res r)
{
this.r = r;
}
public void run()
{
int x = 1;
while(true)
{
if(x == 1)
r.set("mike",34);
else
r.set("李丽",25);
x = x % 2;
x++;
}
}
}
class Output implements Runnable
{
private Res r;
Output(Res r)
{
this.r = r;
}
public void run()
{
while (true)
{
r.get();
}
}
}
复制代码
作者:
wanghe826
时间:
2014-5-8 17:57
skill20 发表于 2014-5-8 17:55
嗯,谢谢! 这个demo不错!
作者:
renshu16
时间:
2014-5-8 18:09
刚好也学到这块,学习一下
作者:
轻语。
时间:
2014-5-8 19:08
其实拿毕老师的代码和视频多看几遍敲几遍 效果更好哦。
作者:
wanghe826
时间:
2014-5-8 20:10
伍叶竹 发表于 2014-5-8 19:08
其实拿毕老师的代码和视频多看几遍敲几遍 效果更好哦。
也是额,贵在坚持!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2